我很困惑为什么这个函数的第一个和第三个版本会给出这个错误,而第二个定义工作正常。
-- 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
不会匹配长度为零、一或二的列表。third
andthird3
函数抱怨是因为它[a]
不是一个变量,而是一个模式。[a]
deugars to (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]
表示包含 value 的单例列表a
。这等效于(a:[])
(a 附加到空列表)。
因此,例如,您的第一个函数检查它是否获得单例列表。然后它取单例列表的尾部的头部,这将失败。
您收到的消息是因为您没有涵盖列表的形状:即空列表和具有超过 1 个元素的列表。
而且,当然,您应该收到警告third2
,它是否仅涵盖具有 3 个或更多元素的列表。我敢肯定你忽略了一些东西。