Haskell:函数中的非穷举模式(简单函数)
我不明白为什么这个函数的第一个和第三个版本会给出这个错误,而第二个定义可以正常工作Haskell:函数中的非穷举模式(简单函数),haskell,non-exhaustive-patterns,Haskell,Non Exhaustive Patterns,我不明白为什么这个函数的第一个和第三个版本会给出这个错误,而第二个定义可以正常工作 -- head and tail third :: [a] -> a third [a] = head (tail (tail[a])) -- Pattern matching third2 :: [a] -> a third2 (_:_:x:_) = x -- List indexing third3 :: [a] -> a third3 [a] = [a]!!2 提前感谢奇怪的是,第二
-- head and tail
third :: [a] -> a
third [a] = head (tail (tail[a]))
-- Pattern matching
third2 :: [a] -> a
third2 (_:_:x:_) = x
-- List indexing
third3 :: [a] -> a
third3 [a] = [a]!!2
提前感谢奇怪的是,第二位没有抱怨不详尽 模式,因为
third2
将不匹配长度为0、1或2的列表。
third
和third3
函数抱怨,因为[a]
不是变量,
这是一种模式<代码>[a]将代码减到(a:[])
,因此您可以将它们写成
third (a:[]) = head (tail (a:[]))
third3 (a:[]) = (a:[]) !! 2
这两种方法都不起作用,因为它们是单元素列表。
我怀疑你想要的是
third a = head (tail a)
third3 a = a !! 2
奇怪的是,第二个没有抱怨非详尽无遗 模式,因为
third2
将不匹配长度为0、1或2的列表。
third
和third3
函数抱怨,因为[a]
不是变量,
这是一种模式<代码>[a]将代码减到(a:[])
,因此您可以将它们写成
third (a:[]) = head (tail (a:[]))
third3 (a:[]) = (a:[]) !! 2
这两种方法都不起作用,因为它们是单元素列表。
我怀疑你想要的是
third a = head (tail a)
third3 a = a !! 2
您需要更好地理解语法 基本上,有两个子语法:
[a]
表示类型a的元素列表
在表达式/模式语法中,[a]
表示包含值a
的单例列表。这相当于(a:[])
(空列表的前缀)
因此,您的第一个函数,例如,检查它是否获得单例列表。然后,它以单件列表的尾部的头部为尾部,这将失败
您得到的信息是因为您没有涵盖列表的形状:即空列表和包含多个元素的列表
当然,如果只包含3个或3个以上元素的列表,您应该会收到一条关于
third2
的警告。我肯定你忽略了什么 您需要更好地理解语法
基本上,有两个子语法:
[a]
表示类型a的元素列表
在表达式/模式语法中,[a]
表示包含值a
的单例列表。这相当于(a:[])
(空列表的前缀)
因此,您的第一个函数,例如,检查它是否获得单例列表。然后,它以单件列表的尾部的头部为尾部,这将失败
您得到的信息是因为您没有涵盖列表的形状:即空列表和包含多个元素的列表
当然,如果只包含3个或3个以上元素的列表,您应该会收到一条关于
third2
的警告。我肯定你忽略了什么 问题似乎是第二个函数为什么不产生这样的错误,而不是这个错误意味着什么。我不相信它没有。问题似乎是第二个函数为什么不产生这样的错误,而不是这个错误意味着什么。我不相信它没有。ghc 7.4.1 with-Wall
抱怨了所有三个函数。您使用的编译器是什么?ghc 7.4.1和-Wall
对这三个函数都有抱怨。你用什么编译器?