我很困惑为什么这个函数的第一个和第三个版本会给出这个错误,而第二个定义工作正常。
-- 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
不会匹配长度为零、一或二的列表。third
和 third3
函数抱怨[a]
因为不是变量,这是一种模式。 [a]
脱糖(a:[])
,所以你可以把它们写成
third (a:[]) = head (tail (a:[]))
third3 (a:[]) = (a:[]) !! 2
两者都不起作用,因为这些是单元素列表。我怀疑你想要的是
third a = head (tail a)
third3 a = a !! 2
你需要更好地理解语法。
基本上,有 2 个子语法:
- 类型的语法
- 表达式和模式的语法
在类型语法中,[a]
表示list of elements of type a
在表达式/模式语法中,[a]
表示包含值 a
的单例列表。这等效于 (a:[])
(附加到空列表前面(。
因此,例如,您的第一个函数检查它是否获得单例列表。然后它采用单例列表的尾部的尾部,这将失败。
您收到的消息是因为有些列表的形状您没有涵盖:即空列表和具有 1 个以上元素的列表。
而且,当然,您应该收到警告 third2
,它是否仅涵盖具有 3 个或更多元素的列表。我相信你忽略了什么。