2012-01-18 21 views
28

Sadece Haskell kod parçası aşağıdaki sözdizimi karşılaştım? {} otomatik argümanlar herhangi bir sayı için uyuyor mu?Bu haskell sözdizimi nedir?</p> <pre><code>data A = A Int Int | B m :: A -> Int m a = case a of A{} -> 1 _ -> 2 </code></pre> <p>burada ne <code>A{}</code> nedir -

Bu Haskell kayıt sözdizimi fonksiyonları bir demet ve düzenli bir Cebirsel veri türüne desugars gerçeğini kötüye kullandığının bir his var. Bu dava mı?

+5

yeni bir şey her gün bilgi ve şimdi 5 yıldır Haskell programlama oldum; Hayatımdaki sözdizimini hiç görmedim. Yapıcı 'A' değişikliklere parametre sayısı, fonksiyon tanımlama değiştirmek gerekmez çünkü bile –

cevap

28

Evet, A{}, türün kayıt sözdizimi ile bildirilmiş olup olmadığına bakılmaksızın, A yapıcısı ile oluşturulmuş herhangi bir değere eşleşir.

language report F kayıt sözdizimi (F hiçbir katı alana sahiptir sağlanan ile ilan edildi olsa da olmasa yasaldır,

ifadesi F veri yapıcı F {} belirtir - Yukarıdaki dördüncü mermi bakın); Bu

parantez içinde belirtilen dördüncü mermi 'bir katı atlar kayıt sözdizimi ile bir değer oluşturmak için statik bir hata bildiren n F Arity olan ... ⊥n, ⊥1 F'yi işaret alan.

ve pattern matching bölümünde

, kalıpları için gramer kuralları bir

apat -> qcon { fpat1 , … , fpatk }  (labeled pattern, k ≥ 0) 

ve semantik

olarak desen eşleştirme (3.17.3) resmi semantik alt bölümünde verilmektedir
(o) case v of { K {} -> e ; _ -> e′ } 
     = case v of { 
      K _… _ -> e ; _ -> e′ } 
+3

Bu sözdizimi, yararlıdır. Düzenli desen eşleştirmesiyle (ör. "A _ _ -> ...") durum böyle olmaz. –

+0

@Daniel - henüz bu durumda biz değil ifadeler, ancak desen konuşuyorlar. Ben _1 _2 ... _n'where * n * yapıcısının Arity olan 'F {}' F 'eşdeğer olması gerektiğini düşünüyorum. – Ingo

+0

@Ingo Right. Sadece dün gece 'informal semantics' bölümüne baktım, orada hiçbir şey bulamadık, ama ifade kısmı göze çarpıyordu. Birkaç saat uykudan sonra resmi semantik bölümünde bulundu. –

İlgili konular