2016-06-27 18 views
11

szukam sposobu na uproszczenie wzorów funkcyjnych gdy rzeczywiste dane nie są wymagane:Haskell rekord wzorzec dopasowania

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

Czy istnieje sposób, aby prostszy wzór do dopasowywania C, po prostu odrzucając wartości ?

hsdev dodaje wskazówkę "Podpowiedź: używaj wzorów rekordów", ale Google mi tam nie pomógł.

Odpowiedz

28

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.

+0

Świetnie, dzięki. Próbowałem C {_} i C {}}, bezskutecznie. Tylko jedna postać za dużo. ^^ – theduke

+2

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

+0

@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

Powiązane problemy