[英]How to define multiple patterns in Frege?
我在使用多種模式的Frege中定義函數時遇到了麻煩。 基本上,我通過遍歷元組列表來定義映射。 我將其簡化為以下內容:
foo :: a -> [(a, b)] -> b
foo _ [] = [] --nothing found
foo bar (baz, zab):foobar
| bar == baz = zab
| otherwise = foo bar foobar
我收到以下錯誤:
E morse.fr:3: redefinition of `foo` introduced line 2
我見過像其他的例子這是做一個函數定義中使用多個圖案,所以我不知道我做錯了。 為什么我在這里出錯? 我是Frege的新手(和Haskell的新手),所以可能缺少一些簡單的東西,但是我真的不認為這應該成為問題。
我正在使用3.24-7.100版本進行編譯。
這是一個純粹的句法問題,影響到Haskell家族語言的新手。 直到您內部化了函數應用程序的優先級高於中綴表達式的規則時,才會花很長時間。
結果是:
此外,在Frege中,以下規則適用:
就兩側允許的詞素而言,定義左側的函數應用程序和中綴表達式的語法與右側的語法相同。 (僅當不使用
@
和~
時,這才在Haskell中成立。)
這樣,您就可以定義一個附加函數,如下所示:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.