Haskell Language
Creazione di tipi di dati personalizzati
Ricerca…
Creazione di un tipo di dati semplice
Il modo più semplice per creare un tipo di dati personalizzato in Haskell è utilizzare la parola chiave data
:
data Foo = Bar | Biz
Il nome del tipo è specificato tra i data
e =
, ed è chiamato un costruttore di tipi . After =
specifichiamo tutti i costruttori di valore del nostro tipo di dati, delimitati da |
cartello. C'è una regola in Haskell che tutti i costruttori di tipo e valore devono iniziare con una lettera maiuscola. La dichiarazione di cui sopra può essere letta come segue:
Definisci un tipo chiamato
Foo
, che ha due possibili valori:Bar
eBiz
.
Creare variabili del nostro tipo personalizzato
let x = Bar
L'istruzione precedente crea una variabile denominata x
di tipo Foo
. Verifichiamo controllando il suo tipo.
:t x
stampe
x :: Foo
Creazione di un tipo di dati con parametri di costruzione del valore
I costruttori di valori sono funzioni che restituiscono un valore di un tipo di dati. Per questo motivo, come qualsiasi altra funzione, possono assumere uno o più parametri:
data Foo = Bar String Int | Biz String
Controlliamo il tipo di costruttore del valore Bar
.
:t Bar
stampe
Bar :: String -> Int -> Foo
che dimostra che Bar
è davvero una funzione.
Creare variabili del nostro tipo personalizzato
let x = Bar "Hello" 10
let y = Biz "Goodbye"
Creazione di un tipo di dati con parametri di tipo
I costruttori di tipi possono assumere uno o più parametri di tipo:
data Foo a b = Bar a b | Biz a b
Digitare i parametri in Haskell deve iniziare con una lettera minuscola. Il nostro tipo di dati personalizzati non è ancora un tipo reale. Per creare valori del nostro tipo, dobbiamo sostituire tutti i parametri di tipo con tipi reali. Poiché a
e b
possono essere di qualsiasi tipo, i nostri costruttori di valori sono funzioni polimorfiche.
Creare variabili del nostro tipo personalizzato
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
Tipo di dati personalizzato con parametri di registrazione
Supponiamo di voler creare un tipo di dati Persona, che ha un nome e un cognome, un'età, un numero di telefono, una strada, un codice postale e una città.
Potremmo scrivere
data Person = Person String String Int Int String String String
Se vogliamo ora ottenere il numero di telefono, dobbiamo fare una funzione
getPhone :: Person -> Int
getPhone (Person _ _ _ phone _ _ _) = phone
Bene, non è divertente. Possiamo fare meglio usando i parametri:
data Person' = Person' { firstName :: String
, lastName :: String
, age :: Int
, phone :: Int
, street :: String
, code :: String
, town :: String }
Ora abbiamo il phone
funzione dove
:t phone
phone :: Person' -> Int
Ora possiamo fare tutto ciò che vogliamo, ad esempio:
printPhone :: Person' -> IO ()
printPhone = putStrLn . show . phone
Possiamo anche associare il numero di telefono con Pattern Matching :
getPhone' :: Person' -> Int
getPhone' (Person {phone = p}) = p
Per un facile utilizzo dei parametri vedi RecordWildCards