非穷举模式匹配? (Haskell)

Non Exhaustive Pattern Matching? (Haskell)

出于某种原因,当我 运行 例如 split1 [1,2,3,4,5,6,7,8,9,10] 的代码时,我得到一个错误

p :: Int -> Bool
p x  = if x < 5 then True else False

split1 [xs] = [([x,y]) | x <- [xs], y <- [xs], p x == True, p y == False]

即使我 运行 它与 split1 [1] 我得到一个空集。有人可以告诉我哪里错了吗?谢谢。

当你说:

split1 [xs] = ...

您实际上是在对第一个参数进行模式匹配。 [xs] 是只有一个元素的列表的模式。你需要的是:

split1 xs = [([x,y]) | x <- xs, y <- xs, p x == True, p y == False]

请注意,我也删除了定义中 xs 周围的列表括号。

我不知道你想做什么,但你可能也想去掉 ([x,y]) 中的列表括号。

split1 xs = [(x,y) | x <- xs, y <- xs, p x == True, p y == False]