19

我只是想知道是否有可能匹配的函數式編程語言(哈斯克爾/ F#/ CAML)設施的類型對陣多次相同的值。模式匹配相同的值

試想以下示例的:當所述功能與兩個相似的值(其將被存儲在a)調用

plus a a = 2 * a 
plus a b = a + b 

的第一變型將被調用。

一個更有用的應用將是本(簡化的AST)。

simplify (Add a a) = Mult 2 a 

但哈斯克爾拒絕這些代碼,並警告我的衝突的定義爲a - 我必須做明確的情況下/ IF-檢查,而不是找出功能是否得到了相同的值。是否有任何技巧表明我想要匹配的變量會多次出現?

+0

FWIW,Mathematica支持這一點。 – 2010-08-04 06:50:42

回答

13

你不能有兩個參數具有相同的名稱,以表明他們應該是平等的,但你可以使用guards區分情況是這樣的:

plus a b 
    | a == b = 2 * a 
    | otherwise = a + b 

這是更靈活,因爲它也適用於比簡單平等更復雜的條件。

+0

是的,我知道警衛,但我試圖避免任何手動比較。 – Dario 2009-07-24 17:47:15

+0

有點簡寫爲:http:// stackoverflow。com/questions/480769/f-matching-with-two-values/501541#501541 – Dario 2009-07-24 17:50:46

-1

Haskell沒有做統一。

+4

這將需要雙方的自由變量統一。 – 2009-07-26 21:24:19

+1

這只是平等,不是統一。像`|一樣a,a when a = a - > ..`。 – 2011-02-22 09:48:41

0

我剛纔介紹了在托馬斯的回答給出的郵件列表線程,並且在其中的一個很有意義的第一個答覆,並解釋爲什麼這樣一個「模式」不會讓一般多大意義:如果a是一個功能? (通常不可能檢查它有兩個函數是相等的。)

-1

我已經實現了一種新的函數式編程語言,它可以處理Haskell中的非線性模式。

https://github.com/egison/egison

在我的語言,你plus功能寫成如下。

(define $plus 
    (match-lambda [integer integer] 
    {[[$a ,a] (* a 2)] 
    [[$a $b] (+ a b)]}))