簡體   English   中英

如何在Frege中定義多個模式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM