我明天正在接受测试培训,以完成我对函数式编程的介绍,但有一点我不明白。
每当我有一个类似的程序时:
test [] = []
test (x:xs) = test (xs)
他所做的是他从名单中取出第一个元素并继续其余部分。只剩下一个,xs
应为[]
,而test [] = []
应该触发Exception: <interactive>:20:5-16: Non-exhaustive patterns in function test.
。但每当我运行此算法时,我都会收到错误。 {{1}}
我无法在网上找到明确的解释。有人可以给我发一个清楚解释或者向我解释的链接吗?
答案 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
请注意我们现在能够很好地了解我们的功能范围!
希望这会有所帮助。干杯!