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