非穷举模式匹配? (Haskell的)

时间:2015-11-08 17:30:05

标签: haskell list-comprehension

出于某种原因,当我用exmaple运行代码时,让我们说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]运行它,我也会得到一个空集。有人能告诉我哪里错了吗?谢谢。

1 个答案:

答案 0 :(得分:2)

当你说:

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]