2017-02-11 57 views
1

我在使用多種模式的Frege中定義函數時遇到了一些問題。基本上,我通過迭代元組列表來定義映射。我已經簡化它歸結爲以下幾點:如何在Frege中定義多個模式?

​​

我得到以下錯誤:

E morse.fr:3: redefinition of `foo` introduced line 2 

我見過的做一個函數定義使用多模式的其它例子像this,所以我不知道我做錯了什麼。爲什麼我在這裏得到一個錯誤?我是新來的弗雷格(對哈斯克爾來說是新手),所以可能有些簡單的我錯過了,但我真的不認爲這應該是一個問題。

我正在編譯版本3.24-7.100。

+2

您可能需要在'(baz,zab):foobar'圖案周圍添加parens。像'foo吧((baz,zab):foobar)' – Alec

回答

2

這是一個純粹的語法問題,影響到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 
+0

這很有道理。感謝您的詳細解答! –

相關問題