2012-04-26 69 views
-2

有人告訴我,這個函數的聲明是非法的:哈斯克爾非法的模式匹配

F3 1(F2 X)Y

我不明白爲什麼這是非法的,我認爲這是與第二參數(f2 x)。任何人都可以向我解釋這個嗎?

+13

這不是一個聲明。這是一個表達片段。周圍的代碼是什麼?你會得到什麼錯誤? – 2012-04-26 19:14:42

+0

它是haskell入門課程考試題的一部分。問題是:對於使用模式的以下函數定義左側(定義函數f1,f2,f3,f4 和f5),說明模式是否合法,如果合法,則精確解釋它們與哪些參數值相匹配如果違法,請解釋他們爲什麼不被允許。(i)f1 1(f2 x)y(ii)f2 0(x:'x':cs)8(iii)f3 zy (iv)f4(a:[b])(v)f5 a 1 [4 ,a] [] – grimebox 2012-04-27 12:50:30

+0

我理解他們除了部分(i) – grimebox 2012-04-27 12:51:54

回答

8

在函數定義,該函數的參數必須patterns,即,它們必須是

  • 通配符_,它匹配一切並結合無關,
  • 可變圖案var,其匹配所有內容並將相應的參數綁定到參數
  • 一個文字(整數,浮點數,字符或字符串),它將參數與模式匹配,
  • value co nstructor施加到儘可能多的圖案作爲其元數要求(從而圖案可以嵌套),
  • 列表圖案[elem1, elem2, elem3, elem4]
  • 標記圖案Con{ field1 = value1, field2 = value2 }
  • 一個parenthesised圖案(pattern)
  • 一個元組模式(pattern1, pattern2, pattern3)
  • 一個作爲圖案[email protected],整個參數var和組件結合,如果它匹配pattern,或
  • 的對應部分
  • 一個無可辯駁的模式~pattern,它綁定參數。其部分分別爲pattern。其部分,並且如果參數實際上不匹配pattern,則會導致運行時錯誤。

在片段

f3 1 (f2 x) y 

的部分(f2 x)不是圖案,但表達,施加到一個值(x)(f2)的函數的,因此一個功能定義不能具有形式

f3 1 (f2 x) y = whatever 

最接近的合法函數的定義是

f3 1 (F2 x) y = ... 

與一個(一元)價值構造函數F2