Kurzusok
/
Elm
Elm
/
Feladatok
/
Kincsesláda
Kincsesláda

Kincsesláda

Tanulófeladat

Bevezetés

Generikus típusok

Bevezetés

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

Paraméterek a típusokban

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 
    }

Típusparaméterek a függvényekben

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

Utasítások

Ebben a feladatban egy általános (vagyis varázslatos!) TreasureChest-et írsz majd, hogy kincseket tárolhass benne.

1. Definiáld a TreasureChest általános egyedi típust

Definiá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.

2. Definiáld a getTreasure függvényt

A függvény két paramétert vár:

  • egy String értéket (egy jelszó kipróbálásához)
  • egy TreasureChest általános egyedi típust

A 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.

3. Definiáld a multiplyTreasure függvényt

Ez a (magasabb rendű) függvény két paramétert vár:

  • egy szorzófüggvényt, amely egy általános paramétert kap, és ugyanannak az általános típusnak a listáját adja vissza
  • egy TreasureChest általános egyedi típust, szintén ugyanazzal az általános típussal

A 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).

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Elm Exercism

Készen állsz elkezdeni a(z) Kincsesláda feladatot?

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.