這是一個純粹的語法問題,影響到Haskell家族語言的新手。在內部化函數應用程序比中綴表達式更高的規則之前,不會花太長時間。
這是有後果:
- 的功能應用複雜的參數需要括號。
- 在中綴表達式中,運算符兩側的函數應用程序不需要括號(但是,函數應用程序的單個組件可能仍然需要它們)。
在弗雷格,此外,以下規則成立:
The syntax of function application and infix expressions on the left hand side of a definition is identical to the one on the right hand side as far as lexemes allowed on both sides are concerned. (This holds in Haskell only when @
and ~
are not used.)
這樣,您可以定義一個新增功能是這樣的:
data Number = Z | Succ Number
a + Z = a
a + Succ b = Succ a + b
因此,當你申請這你的例子,你從句法上看到,你將重新定義運算符:
。爲了達到你想要什麼,你需要它這樣寫:
foo bar ((baz, zab):foobar) = ....
-- ^ ^
這對應於你申請foo
你正在構建一個列表的情況:
foo 42 (x:xs)
當你寫
foo 42 x:xs
這意味着
(foo 42 x):xs
您可能需要在'(baz,zab):foobar'圖案周圍添加parens。像'foo吧((baz,zab):foobar)' – Alec