Haskell:非详尽模式

时间:2014-09-26 07:16:05

标签: haskell ghci non-exhaustive-patterns

我明天正在接受测试培训,以完成我对函数式编程的介绍,但有一点我不明白。

每当我有一个类似的程序时:

test [] = []
test (x:xs) = test (xs)

他所做的是他从名单中取出第一个元素并继续其余部分。只剩下一个,xs应为[],而test [] = []应该触发Exception: <interactive>:20:5-16: Non-exhaustive patterns in function test.。但每当我运行此算法时,我都会收到错误。 {{1}}

我无法在网上找到明确的解释。有人可以给我发一个清楚解释或者向我解释的链接吗?

2 个答案:

答案 0 :(得分:27)

您在问题正文中发布的代码详尽的模式匹配。但是,如果您尝试将此定义输入ghci,则应使用单个 let语句:

Prelude> let test [] = [] ; test (x:xs) = test xs

您正在做的事情here不正确。您首先要定义一个非详尽的函数test

Prelude> let test [] = []

然后你定义另一个非穷举函数,也称为test,隐藏了第一个函数:

Prelude> let test (x:xs) = test xs

答案 1 :(得分:4)

在Haskell的REPL(GHCi)中试用婴儿程序确实是一件非常棘手的事。

使用let并不是很明显(特别是,因为在单独的脚本/程序中不需要它)。

有时我们不想创建一个完整的文件,而是尝试使用具有不同情况的小功能。

另一种有用的方法是使用分隔符:{&amp; :}来定义我们的职能范围。

假设我们想要尝试一个简单的递归sum函数,它可以添加一个数字列表。然后我们会说以下内容:

λ > :{
Prelude| sum [] = 0
Prelude| sum (x:xs) = x + sum xs
Prelude| :}
sum :: Num t => [t] -> t
Prelude
λ > sum [1..10]
55
it :: (Enum t, Num t) => t

请注意我们现在能够很好地了解我们的功能范围!

希望这会有所帮助。干杯!