0

我很困惑为什么这个函数的第一个和第三个版本会给出这个错误,而第二个定义工作正常。

-- 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

提前致谢

4

2 回答 2

4

奇怪的是,第二个没有抱怨非穷举模式,因为third2不会匹配长度为零、一或二的列表。thirdandthird3函数抱怨是因为它[a]不是一个变量,而是一个模式。[a]deugars to (a:[]),所以你可以把它们写成

third (a:[]) = head (tail (a:[]))

third3 (a:[]) = (a:[]) !! 2

两者都不起作用,因为它们是单元素列表。我怀疑你想要的是

third a = head (tail a)

third3 a = a !! 2
于 2013-02-15T15:11:48.140 回答
1

您需要更好地理解语法。

基本上,有 2 个子语法:

  1. 类型的语法
  2. 表达式和模式的语法

在类型语法中,[a]意味着list of elements of type a

在表达式/模式语法中,[a]表示包含 value 的单例列表a。这等效于(a:[]) (a 附加到空列表)。

因此,例如,您的第一个函数检查它是否获得单例列表。然后它取单例列表的尾部的头部,这将失败。

您收到的消息是因为您没有涵盖列表的形状:即空列表和具有超过 1 个元素的列表。

而且,当然,您应该收到警告third2,它是否仅涵盖具有 3 个或更多元素的列表。我敢肯定你忽略了一些东西。

于 2013-02-15T15:13:38.027 回答