Można używać wzorców rekordowe tak:
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
wzory Record pozwala nadać nazwy dziedzinach konstruktorów. można również robić takie rzeczy jak:
myfn C{name=n} = length n
więc widać, że można wzór mecz tylko na konkretnej dziedzinie trzeba.
Uwaga: można użyć pusty rekord wzór nawet z typów danych, które nie używają składni rekordu:
data A = A Int | B Int Int
myfn A{} = 1
myfn B{} = 2
To jest w porządku. Istnieje szereg innych rozszerzeń związanych z wzorami rekord:
RecordWildCards
pozwala pisać takie rzeczy jak C{..}
który jest odpowiednikiem wzoru: C{x=x, y=y, name=name}
, to znaczy, że pasuje do wszystkich pól i masz teraz w zasięgu x
z wartość dopasowana do pola x
itp
NamedFieldPuns
pozwala pisać C{name}
za równoważne C{name=name}
, tak że name
jest teraz w zakresie i zawiera wartość dopasowaną doPole.
Należy pamiętać, że przy użyciu wzorców rekord nie przeszkadza w używaniu swoich konstruktorów w sposób pozycyjnej, więc nadal można napisać:
myfn (B _) = 200
To tylko dodaje funkcjonalności.
Świetnie, dzięki. Próbowałem C {_} i C {}}, bezskutecznie. Tylko jedna postać za dużo. ^^ – theduke
Wstydzę się, że Google nie pomaga w "wzorca rekordu haskell". Zmieniłem nazwę tego pytania, może to sprawi, że będzie on łatwiejszy do wykrycia dla innych. – theduke
@theduke: Zauważ także, że możesz użyć pustego wzorca zapisu ('B {}'), nawet jeśli zadeklarowałeś, że 'B' jest normalnym, nie-rekordowym typem danych. – Lii