A Dict az Elmben egy változtathatatlan szótár, amely nulla vagy több kulcs-érték párt tartalmaz.
A szótárakat a Dict modulban definiált függvényekkel és operátorokkal kezelheted.
A szótárak típusjelölése így néz ki:
Dict String (List Int) --> a dict with String keys and List Int values
Dict Int String --> a dict with Int keys and String values
A szótárakat így hozhatod létre:
empty : Dict Int String
empty = Dict.empty
singleValue = Dict.singleton 5 "Value for key 5" --> Dict Int String
twoValues = Dict.fromList [ ( "Alice", 0 ), ( "Bob", 1 ) ] --> Dict String Int
Az elemeket a get segítségével kérheted le.
Mivel egy kulcs lehet, hogy benne van a szótárban, és az is lehet, hogy nincs, az eredményt egy Maybe típusba csomagolja a függvény.
alice = Dict.fromList [ ( 0, "Alice" ) ]
keyExists = Dict.get 0 alice --> Just "Alice"
keyNotPresent = Dict.get 1 alice --> Nothing
Az elemeket az insert segítségével adhatod hozzá.
A már a szótárban lévő kulcsokhoz tartozó elemek lecserélődnek.
alice = Dict.fromList [ ( "Alice", 0 ) ]
aliceAndBob = Dict.insert "Bob" 1 alice --> Dict.fromList [ ( "Alice", 0 ), ( "Bob", 1 ) ]
aliceAndAlice = Dict.insert "Alice" 1 alice --> Dict.fromList [ ( "Alice", 1 ) ]
Az elemeket az update segítségével frissítheted.
Ha a kulcs nem létezik, az update függvény Nothing értékkel lesz meghívva.
alice = Dict.fromList [ ( 0, "Alice" ) ]
aliceUpperCase = Dict.update 0 (Maybe.map String.toUpper) alice --> Dict.fromList [ ( 0, "ALICE" ) ]
aliceNoCase = Dict.update 0 (\_ -> Nothing) alice --> Dict.empty
bobUpperCase = Dict.update 1 (\_ -> Just "BOB") alice --> Dict.fromList [ ( 0, "Alice" ), ( 1, "BOB" ) ]
bobNoCase = Dict.update 1 (\_ -> Nothing) alice --> Dict.fromList [ ( 0, "Alice" ) ]
Az elemeket a remove segítségével távolíthatod el.
Ha a kulcs nem létezik, nem történik változás.
alice = Dict.fromList [ ( 0, "Alice" ) ]
stillAlice = Dict.remove 1 --> ( 0, "Alice" )
empty = Dict.remove 0 alice --> Dict.empty
A kulcs-érték párok listáját a fromList segítségével szótárrá alakíthatod.
alice = Dict.fromList [ ( 0, "Bob" ), ( 0, "Alice" ) ]
--> True Dict.fromList [ ( 0, "Alice" ) ]
Az elemeket a toList segítségével listává alakíthatod.
A lista a kulcsok szerint rendezett.
aliceAndBob = Dict.fromList [ ( 1, "Alice" ), ( 0, "Bob" ) ]
bobAndAlice = Dict.toList aliceAndBob
--> [ ( 0, "Bob" ), ( 1, "Alice" ) ]
Több elemet a filter segítségével távolíthatsz el.
aliceAndBob = Dict.fromList [ ( "Alice", 1 ), ( "Bob", 0 ) ]
bob = Dict.filter (\name count -> name == "Bob") aliceAndBob --> Dict.fromList [ ( "Bob", 0 ) ]
Az elemeket a map segítségével alakíthatod át.
alice = Dict.fromList [ ( "Alice", 0 ) ]
empty = Dict.map (\player count -> count + 1) alice --> Dict.fromList [ ( "Alice", 1 ) ]
A szótárak a merge segítségével összevonhatók / átalakíthatók.
aliceAndBob = Dict.fromList [ ( "Alice", 1 ), ( "Bob", 1 ) ]
bobAndCedd = Dict.fromList [ ( "Bob", 1 ), ( "Cedd", 1 ) ]
firstDictCountsDouble = Dict.merge
-- when only in aliceAndBob
(\name count mergedCounts -> Dict.insert name (2 * count) mergedCounts)
-- when in aliceAndBob and bobAndCedd
(\name aliceAndBobCount bobAndCeddCount mergedCounts -> Dict.insert name (2 * aliceAndBobCount + bobAndCeddCount) mergedCounts)
-- when only in bobAndCedd
(\name count mergedCounts -> Dict.insert name count mergedCounts)
-- the two dicts to merge
aliceAndBob
bobAndCedd
-- the initial state of the merge
Dict.empty
--> Dict.fromList [ ( "Alice", 2 ), ( "Bob", 3 ), ( "Cedd", 1 ) ]
Bármely függvény vagy operátor, amely úgy tűnik, hogy módosít egy szótárat (például hozzáad egy elemet), valójában egy új szótárat ad vissza. A teljesítmény általában nem jelent problémát, mert a megvalósítás megakadályozza a felesleges allokációkat/másolatokat.
Elmben általában jobb magasabb szintű absztrakciókat használni, például a Dict.map, Dict.filter és Dict.merge függvényeket, az alacsonyabb szintű absztrakciók, például a Dict.get és Dict.remove helyett, bár ez természetesen a kontextustól függ.
A feladatod, hogy fogj egy játék gólszerzőinek listáját, és számold meg, hány gólt szerzett az egyes játékosok.
A PlayerName a String típusaliasa, amely megkönnyíti a kód olvasását, és megkülönbözteti a String ezen használatát a String más használataitól.
Először implementáld az updateGoalCountForPlayer függvényt, amely inicializálja vagy növeli egy játékos gólszámát.
Ezután implementáld az aggregateScorers függvényt, amely az updateGoalCountForPlayer használatával megszámolja, hány gólt szerzett az egyes játékosok.
Ez a függvény egy List PlayerName értéket kap (a gólt szerző játékosok neveit, amely ismétlődő játékosneveket tartalmazhat), és egy Dict PlayerName Int értéket ad vissza, amely a listában szereplő összes játékost tartalmazza, és azt is, hogy hány gólt szereztek.
aggregateScorers [ "Betty", "Cedd", "Betty" ]
--> Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ]
Implementáld a removeInsignificantPlayers függvényt, amely kiszűri azokat a játékosokat, akik kevesebb gólt szereztek, mint a küszöbérték.
removeInsignificantPlayers 2 (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> Dict.fromList [ ( "Betty", 2 ) ]
Implementáld a resetPlayerGoalCount függvényt, amely egy játékos megszerzett góljait nullára állítja.
resetPlayerGoalCount "Cedd" (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 0 ) ]
Implementáld a formatPlayer függvényt, amely egy játékos gólszámát szövegként formázza. Ha a játékos nem szerepel a szótárban, feltételezd, hogy a gólszáma nulla.
formatPlayer "Betty" (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> "Betty: 2"
Implementáld a formatPlayers függvényt, amely az összes játékos gólszámát szövegként formázza. A játékosokat a nevük szerint kell sorba rendezni.
formatPlayers (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> "Betty: 2, Cedd: 1"
Implementáld a combineGames függvényt, amely megszámolja, hogy az egyes játékosok összesen hány gólt szereztek a két játékban.
combine Games
(Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
(Dict.fromList [ ( "Betty", 2 ), ( "Mario", 3 ) ] )
--> Dict.fromList [ ( "Betty", 4 ), ( "Cedd", 1 ), ( "Mario", 3 ) ]
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.