2016-06-27 18 views
11
gerçek veri gerekli değilken ben işlev desenleri basitleştirmek için bir yol arıyorum

: Haskell rekor desen

data X = A | B String | C Int Int String 
myfn :: X -> Int 
myfn A = 50 
myfn (B _) = 200 
myfn (C _ _ _) = 500 

sadece değerlerini atarak, C eşleştirme için daha basit bir desen yapmak için bir yolu var mı ?

hsdev bir ipucu ekler "İpucu: kayıt desenlerini kullan", ancak Google bana yardımcı olmadı.

cevap

28

Böyle rekor desenleri kullanabilirsiniz:

data X = A | B {name :: String} | C {x::Int, y::Int, name::String} 

myfn :: X -> Int 
myfn A = 50 
myfn B{} = 200 
myfn C{} = 500 

Kayıt desenleri inşaatçı alanlara isim vermek için izin verir. Böylece sadece ihtiyacınız belirli bir alan üzerinde desen maçı can görebilirsiniz

myfn C{name=n} = length n 

: da benzeri şeyler yapabilirsiniz.

Not: bile rekor sözdizimi kullanmayın veri türleri ile boş kayıt deseni kullanabilirsiniz:

data A = A Int | B Int Int 

myfn A{} = 1 
myfn B{} = 2 

Bu gayet iyi. Orada rekor desenleri ile ilgili diğer uzantıları bir dizi: tüm alanları eşleşir ve artık birlikte kapsam x var yani C{x=x, y=y, name=name}:

  • RecordWildCards Eğer desen eşdeğerdir C{..} gibi şeyler yazmasına olanak tanır kapsam şimdi ve name böylece

  • NamedFieldPuns

    Eğer C{name=name} eşdeğer olduğu C{name} yazmasına olanak tanır vb x alan için eşleştirilmiş değerieşleşti değeri içeriralanı.

rekor kalıpları kullanarak bir pozisyonel bir şekilde kurucular kullanmanızı engellemez unutmayın, bu yüzden hala yazabilirsiniz: Sadece işlevselliği ekler

myfn (B _) = 200 

.

+0

Harika, teşekkürler. Aslında C {_} ve C {..} 'yi boşa çıkardım. Sadece bir karakter çok fazla. ^^ – theduke

+2

Google'ın "haskell kayıt kalıbı" ile size pek yardımcı olmadığı konusunda utanç verin. Soruyu yeniden adlandırdım, belki bu başkaları için daha keşfedilebilir hale getirebilir. – theduke

+0

@theduke: Ayrıca, B 'nin normal, kayıt dışı bir veri türü olduğunu bildirmiş olsanız bile boş kayıt modelini (' B {} ') kullanabileceğinizi de unutmayın. – Lii