Kurzusok
/
Elm
Elm
/
Feladatok
/
Jegyet, kérem!
Jegyet, kérem!

Jegyet, kérem!

Tanulófeladat

Bevezetés

Mintaillesztés

A mintaillesztés kifejező elágazó kódot tesz lehetővé, a destrukturálás pedig elegáns módot ad arra, hogy az értékeket változókhoz kössük.

Egyszerű mintaillesztés

A mintaillesztéssel a case utasítás segítségével értékeket köthetsz változókhoz, vagy a _ helyettesítő karakterrel el is dobhatod őket.

type Entity = Alien | Stranger (Maybe String) | Friend { name: String }

hello : Entity -> String
hello entity =
    case entity of
        -- Custom type variant
        Alien -> "Hello, you are not from around here are you?"
        -- Binding to a litteral value nested in Stranger
        Stranger (Just nametag) -> "Hello, erm... " ++ nametag ++ "."
        -- Discarding Friend's data
        Friend _ -> "Hi!"
        -- All other cases
        _ -> "Hello stranger!"

Destrukturálás

A destrukturálás értékeket köthet let kötésekben, függvényargumentumokban, és természetesen a case kifejezésekben is, valahányszor az adatoknak csak egyetlen lehetséges formája van.

pairSum : ( Int, Int ) -> Int
pairSum pair =
    -- Destructuring of a pair in a 'let' binding
    let ( x, y ) = pair
    in x + y

-- Destructuring in the function argument
pairSum : ( Int, Int ) -> Int
pairSum ( x, y ) = x + y

-- Custom type containing a single variant
type Container = Box String

-- Destructuring in the function argument
unbox : Container -> String
unbox (Box str) = str

-- Destructuring combined with pattern matching
unboxMaybe : Maybe Container -> Maybe String
unboxMaybe maybeContainer =
    case maybeContainer of
        Nothing -> Nothing
        Just (Box "42") -> Just "The answer to the universe!"
        Just (Box str) -> Just str

A destrukturálás rekordoknál is használható, illetve az as kulcsszóval is.

type alias Circle =
    { radius : Float
    , center : ( Float, Float )
    }

perimeter : Circle -> Float
perimeter { radius } =
    2 * pi * radius

left : Circle -> Float
left { radius, center } =
    -- the pair center cannot be pattern matched directly in the function argument
    -- so we do it in a 'let' statement
    let ( x, _ ) = center
    in x - radius

-- using the 'as' keyword to bind both the fields and the whole record
smaller : Float -> Circle -> Circle
smaller reduction ({ radius } as circle) =
    if reduction < radius then
        { circle | radius = radius - reduction }
    else
        circle

Utasítások

Az IT-ügyfélszolgálat csapatának tagja vagy, és szeretnéd hatékonyabbá tenni a jegykezelő rendszert, valamint statisztikákat szeretnél adni a menedzserednek.

Egy jegynek van státusza (új, folyamatban...), létrehozója (akit felhasználónév és alkalmazotti azonosító azonosít), hozzárendelhető egy IT-alkalmazotthoz, és tartalmazza a hozzászólások előzményeit.

Négy részfeladat következik, amellyel fejlesztheted a jelenlegi jegykezelő rendszeredet.

1. Üres hozzászólások felismerése

Az üres hozzászólások zsúfolják a felületet, és nem hordoznak információt, ezért szeretnéd kiszűrni őket.

Definiálj egy emptyComment segédfüggvényt, amely egy felhasználó/hozzászólás párt kap, és True-t ad vissza az üres hozzászólásokra.

A függvény argumentumában destrukturálással közvetlenül bontsd ki a felhasználót és a hozzászólást. A felhasználót hagyd figyelmen kívül, mert nincs rá szükséged.

emptyComment ( User "Alice", "" )
-- => True

2. A létrehozó hozzászólásainak megszámolása

A menedzsered statisztikákat szeretne arról, mennyire vesznek részt a felhasználók a jegykezelési folyamatban. Arra kér, hogy nézd meg, hány hozzászólást fűzött hozzá a jegy létrehozója.

Definiáld a numberOfCreatorComments függvényt, amely egy jegyet kap, és visszaadja a jegy létrehozója által hozzáadott hozzászólások számát.

A függvény argumentumában destrukturálással egyszerre bontsd ki a rekordot a Ticket típusból és a szükséges mezőket a rekordból. Ezután egy let kötésben destrukturáld a createdBy mezőt, hogy meg tudd számolni a releváns hozzászólásokat. A számoláshoz használj List-függvényeket, és egy névtelen függvény argumentumában destrukturálással válaszd szét a felhasználó/hozzászólás párt.

numberOfCreatorComments
numberOfCreatorComments
    (Ticket
        { status = Closed
        , createdBy = ( User "Chiaki", 1 )
        , assignedTo = Nothing
        , comments = [ ( User "Chiaki", "Never mind, fixed it." ) ]
        }
    )
-- => 1

3. A Dev Teamhez hozzárendelt jegyek felismerése

Néhány jegyet eszkalálni kell a Dev Team tagjaihoz: Alice-hez, Bobhoz vagy Charlie-hoz. Fontos, hogy szemmel tartsd ezeket, hogy biztosan haladjanak.

Definiálj egy assignedToDevTeam segédfüggvényt, amely ellenőrzi, hogy egy jegyet a Dev Team valamelyik tagjához rendeltek-e.

A függvény argumentumában destrukturálással bontsd ki a rekordot a Ticket típusból, valamint a szükséges mezőt. Ezután egyetlen case utasítással ellenőrizd, hogy a jegyet Alice-hez, Bobhoz vagy Charlie-hoz rendelték-e, rekurzív mintaillesztéssel kinyerve a felhasználónevüket, és literál mintaillesztéssel illesztve rájuk.

assignedToDevTeam
    (Ticket
        { status = InProgress
        , createdBy = ( User "Bill", 2 )
        , assignedTo = Just (User "Alice")
        , comments = [ ( User "Bill", "What's an 'undefined'?" ) ]
        }
    )
-- => True

4. Jegyek hozzárendelése IT-alkalmazottakhoz

Néha egyszerre több jegyet kell más IT-alkalmazottakhoz rendelni.

Definiáld az assignTicketTo függvényt, amely segít ebben. A függvény két argumentumot kap: egy felhasználót, akihez a jegyet rendelni kell, és egy jegyet. Ha a jegy státusza New, rendeld hozzá az új felhasználóhoz, és változtasd a státuszát InProgress-re. Más státuszok esetén egyszerűen rendeld át a jegyet az új felhasználóhoz, kivéve az Archived státuszú jegyeket, amelyeket egyáltalán nem szabad módosítani.

A függvény argumentumában destrukturálással bontsd ki a rekordot a Ticket típusból és a szükséges mezőt, és használd az as kulcsszót is, hogy az egész rekordot úgy rögzítsd, ahogy van. Egyetlen case utasítással illeszd a státuszra, és add vissza a megfelelő jegyet, amelyet az as kulcsszóval rögzített eredeti rekord módosításával hoztál létre.

assignTicketTo (User "Danny")
    (Ticket
        { status = New
        , createdBy = ( User "Jesse", 3 )
        , assignedTo = Just (User "Alice")
        , comments = [ ( User "Jesse", "I've been waiting for 6 months!!" ) ]
        }
    )
-- => Ticket
--        { status = InProgress
--        , createdBy = ( User "Jesse", 3 )
--        , assignedTo = Just (User "Danny")
--        , comments = [ ( User "Jesse", "I've been waiting for 6 months!!" ) ]
--        }
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Elm Exercism

Készen állsz elkezdeni a(z) Jegyet, kérem! 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.