19

İşlevsel programlama dillerinin (Haskell/F #/Caml) desen eşleme özellikleriyle aynı değerlerle aynı değerlerle eşleşmenin mümkün olup olmadığını merak ettim.Eşleşen özdeş değerler

sadece aşağıdaki örnekte düşünmek: fonksiyonu (a saklanabilir olacaktır), iki benzer değerler Çalıştırıldığında

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

birinci varyant olarak isimlendirilirler. Bu daha kullanışlı bir uygulama (AST'nin basitleştirilmesi) olacaktır.

simplify (Add a a) = Mult 2 a 

Ama Haskell bu kodları reddeder ve a için çelişen tanımların beni uyarıyor - Ben fonksiyonu aynı değerleri var olup olmadığını öğrenmek için yerine açık durumda/if-çek yapmak zorundayız. Karşılaşmak istediğim bir değişkenin birden çok kez ortaya çıkacağını gösteren herhangi bir hile var mı?

+0

FWIW, Mathematica bunu desteklemektedir. –

cevap

39

Bu, doğrusal olmayan model olarak adlandırılır. Bu konuda, çok uzun zaman önce, haskell-cafe posta listesinde birkaç iş parçacığı var. İşte iki şunlardır:

http://www.mail-archive.com/[email protected]/msg59617.html

http://www.mail-archive.com/[email protected]/msg62491.html

Alt çizgi: Bu uygulamaya imkansız değil, ama basitlik uğruna karşı karar verildi.

Bu arada çalışmak için if veya case'a ihtiyacınız yoktur; (Hafifçe) temizleyici yolu bir bekçi kullanmaktır: Sadece Thomas'ın cevapta verilen posta listesi konuları bakmis

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

Linkler için teşekkürler - Mükemmel – Dario

13

Onların eşit olması gerektiğini belirtmek için aynı ada sahip iki parametreleri olamaz, ancak böyle durumlarda ayırt etmek guards kullanabilirsiniz: Bu aynı zamanda için çalışır çünkü daha esnektir

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

Basit eşitlikten daha karmaşık koşullar.

+0

Evet, muhafızları biliyorum ama el ile karşılaştırmadan kaçınmaya çalıştım. – Dario

+0

Bunun için kısa yoldan: http: // stackoverflow.com/questions/480769/f-matching-with-two-values ​​/ 501541 # 501541 – Dario

-1

Haskell birleşme yapmaz.

+4

Her iki tarafta da birleşik olmak için serbest değişkenlere ihtiyaç duyar. –

+1

Bu sadece eşitliktir, birleşme değil. Gibi | a, a ne zaman a = a -> .. '. –

0

, ve bunlardan biri iyi mantıklı içinde ilk cevap ve neden böyle açıklıyor Bir "desen" genel olarak çok anlamlı olmaz: a bir işlev ise ne olur? (Genelde iki fonksiyonun eşit olup olmadığını kontrol etmek imkansızdır.)

+0

Sadece '' Eq' olmak için kısıtlamadı? – gdejohn

+0

@gdejohn, semantiklerin doğru olmayacağından şüpheleniyorum. 'Fxx = x' formunun bir tanımını uygularken, IMO'nun sunulan iki argümanın * aynı değer * olduğunu ve bazı tipler açısından sadece" eşit "olmadığını bekleyebilir (aksi halde 'x' iki değerinin geri dönüşü olmalıdır. – Alexey

-1

Haskell'de doğrusal olmayan kalıpları işleyebilen yeni bir işlevsel programlama dili geliştirdim. Benim dilinde

https://github.com/egison/egison

, aşağıdaki gibi yazılır da plus fonksiyonu.

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