A generikus típusok olyan nyelvi funkció, amely lehetővé teszi a kód újrafelhasználását.
Például egy lista hosszának kiszámításához nem számít, hogy a lista milyen típust tárol.
Ezért a length függvény egy generikus a típusparamétert használ a típusszignatúrájában.
length : List a -> Int
Amikor egy típus generikus egy másik típus fölött, akkor arra a másik típusra kisbetűs nevet használunk, és típusparaméternek nevezzük.
Gyakori példák a List, a Maybe és a Result egyedi típusok.
-- Maybe is generic over the type a
type Maybe a
= Nothing
| Just a
someString : Maybe String
someString = Just "hello"
someInt : Maybe Int
someInt = Just 42
A típusparaméterek nevével kapcsolatban fontos megjegyzés, hogy több karakterből is állhatnak. Az egyetlen megkötés, hogy kisbetűs neveknek kell lenniük. Ezért amikor hasznos, igyekszünk beszédes neveket adni nekik.
Egy típus több másik típus fölött is lehet generikus, és így több típusparamétere is lehet. Ebben az esetben minden független típus más kisbetűs nevet kap. Az, hogy függetlenek, nem akadályozza meg, hogy ugyanaz a típus legyen belőlük, csak lehetővé teszi, hogy különbözőek legyenek.
-- Result is generic over the types error and value
type Result error value
= Ok value
| Err error
A rekordtípus-aliasoknak is lehetnek típusparamétereik, bár ez kevésbé gyakori.
-- Event is generic over the type a
type alias Event a =
{ at : Time
, data : a
}
Mivel a típusok lehetnek generikusak, a függvények is azok lehetnek.
Készíthetünk olyan függvényeket, amelyek generikus típusokkal dolgoznak, például a Maybe.withDefault-ot.
withDefault : a -> Maybe a -> a
withDefault default maybe =
case maybe of
Just value -> value
Nothing -> default
Azokat a függvényeket, amelyek más függvényeket vesznek át paraméterként, magasabb rendű függvényeknek nevezzük, és ezek is lehetnek generikusak.
map : (a -> b) -> Maybe a -> Maybe b
map function maybe =
case maybe of
Just value ->
Just (function value)
Nothing ->
Nothing
Ebben a feladatban egy általános (vagyis varázslatos!) TreasureChest-et írsz majd, hogy kincseket tárolhass benne.
TreasureChest általános egyedi típustDefiniálj egy TreasureChest egyedi típust egyetlen változattal.
A változatnak legyen egy hozzá tartozó String értéke, amely a kincsesláda jelszavát fogja tárolni.
A változatnak ezenkívül legyen egy hozzá tartozó általános értéke is, amely a kincset fogja tárolni. Ez az érték azért általános, hogy a kincs bármi lehessen.
getTreasure függvénytA függvény két paramétert vár:
String értéket (egy jelszó kipróbálásához)TreasureChest általános egyedi típustA függvény a megadott jelszókísérletet összehasonlítja a TreasureChest-ben lévő String értékkel.
A függvény egy Maybe értéket ad vissza.
Ha a jelszavak megegyeznek, akkor add vissza a Just értéket a TreasureChest-ből származó általános értékkel (vagyis a kincset!).
Ha a jelszavak nem egyeznek meg, akkor add vissza a Nothing értéket.
multiplyTreasure függvénytEz a (magasabb rendű) függvény két paramétert vár:
TreasureChest általános egyedi típust, szintén ugyanazzal az általános típussalA függvény a szorzófüggvényt a ládában lévő kincssel hívja meg.
A függvény egy új TreasureChest-et ad vissza, ugyanazzal a jelszóval, mint az eredeti, és a megszorzott kincssel (a visszatérési értékkel).
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elm nyelvet 28 fogalom110 feladat segítségével, valódi emberi mentorálással, mindez ingyen.