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 i Biz .

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



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow