Haskell Language
Tworzenie niestandardowych typów danych
Szukaj…
Tworzenie prostego typu danych
Najłatwiejszym sposobem utworzenia niestandardowego typu danych w Haskell jest użycie słowa kluczowego data
:
data Foo = Bar | Biz
Nazwa typu jest określona między data
a =
i nazywa się konstruktorem typu . Po =
określamy wszystkie konstruktory wartości naszego typu danych, rozdzielone znakiem |
znak. W Haskell obowiązuje zasada, że wszystkie konstruktory typów i wartości muszą zaczynać się wielką literą. Powyższą deklarację można odczytać w następujący sposób:
Zdefiniuj typ o nazwie
Foo
, który ma dwie możliwe wartości:Bar
iBiz
.
Tworzenie zmiennych naszego niestandardowego typu
let x = Bar
Powyższa instrukcja tworzy zmienną o nazwie x
typu Foo
. Sprawdźmy to, sprawdzając jego typ.
:t x
odciski
x :: Foo
Tworzenie typu danych z parametrami konstruktora wartości
Konstruktory wartości to funkcje, które zwracają wartość typu danych. Z tego powodu, podobnie jak każda inna funkcja, mogą przyjmować jeden lub więcej parametrów:
data Foo = Bar String Int | Biz String
Sprawdźmy typ konstruktora wartości Bar
.
:t Bar
odciski
Bar :: String -> Int -> Foo
co dowodzi, że Bar
jest rzeczywiście funkcją.
Tworzenie zmiennych naszego niestandardowego typu
let x = Bar "Hello" 10
let y = Biz "Goodbye"
Tworzenie typu danych z parametrami typu
Konstruktory typów mogą przyjmować jeden lub więcej parametrów typu:
data Foo a b = Bar a b | Biz a b
Parametry typu w języku Haskell muszą zaczynać się od małej litery. Nasz niestandardowy typ danych nie jest jeszcze typem rzeczywistym. Aby stworzyć wartości naszego typu, musimy zastąpić wszystkie parametry typu rzeczywistymi typami. Ze względu i a
b
mogą być dowolnego typu, nasze konstruktory wartości są funkcjami polimorficzne.
Tworzenie zmiennych naszego niestandardowego typu
let x = Bar "Hello" 10 -- x :: Foo [Char] Integer
let y = Biz "Goodbye" 6.0 -- y :: Fractional b => Foo [Char] b
let z = Biz True False -- z :: Foo Bool Bool
Niestandardowy typ danych z parametrami rekordu
Załóżmy, że chcemy utworzyć typ danych Osoba, który ma imię i nazwisko, wiek, numer telefonu, ulicę, kod pocztowy i miejscowość.
Moglibyśmy pisać
data Person = Person String String Int Int String String String
Jeśli chcemy teraz uzyskać numer telefonu, musimy wykonać funkcję
getPhone :: Person -> Int
getPhone (Person _ _ _ phone _ _ _) = phone
To nie jest zabawa. Możemy to zrobić lepiej, stosując parametry:
data Person' = Person' { firstName :: String
, lastName :: String
, age :: Int
, phone :: Int
, street :: String
, code :: String
, town :: String }
Teraz dostajemy funkcję phone
gdzie
:t phone
phone :: Person' -> Int
Możemy teraz robić, co chcemy, np .:
printPhone :: Person' -> IO ()
printPhone = putStrLn . show . phone
Możemy również powiązać numer telefonu przez dopasowanie wzoru :
getPhone' :: Person' -> Int
getPhone' (Person {phone = p}) = p
Dla łatwego użycia parametrów patrz RecordWildCards