2013-02-15 62 views
0

我很困惑,为什么这个函数的第一个和第三个版本给出这个错误,而第二个定义正常工作。Haskell:函数中的非穷尽模式(简单函数)

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

预先感谢

+2

ghc 7.4.1用'-Wall'抱怨了所有三个功能。你使用什么编译器? – 2013-02-15 18:34:20

回答

4

即奇怪的是,第二个没有抱怨非穷举 图案,因为third2将不匹配长度零个,一个或两个的列表。 thirdthird3功能抱怨,因为[a]不是变量, 它是一种模式。 [a] desugars到(a:[]),所以你可以写他们作为

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

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

均未将工作,因为那些都是单元素列表。 我怀疑你想要的是

third a = head (tail a) 

third3 a = a !! 2 
1

您需要了解的语法更好。

基本上,有2个子语法:

  1. 语法类型
  2. 语法表达式和图案

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

在表达式/模式语法,[a]表示单例列表,其中包含值a。这相当于(a:[])(预先列在空白列表中)。

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

你得到的消息是因为有你没有覆盖的列表的形状:即空列表和超过1个元素的列表。

而且,当然,您应该收到third2的警告,它是否仅包含具有3个或更多元素的列表。我相信你会忽略一些东西。

+0

这个问题似乎是关于为什么第二个函数不会引发这样的错误,而不是这个错误的含义。 – 2013-02-15 18:20:26

+0

我不相信它没有。 – Ingo 2013-02-15 18:28:51