2013-02-15 69 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