Maybe 타입은 Elm 언어에서 선택적 값을 다루는 해법이에요.
그래서 Elm의 많은 핵심 함수 타입 시그니처에 등장하고, 이를 이해하는 것은 아주 중요해요.
Maybe 타입은 다음과 같이 정의돼요:
type Maybe a = Nothing | Just a
이것을 Elm 용어로 "커스텀 타입" 정의라고 해요.
이 정의는 이 타입의 값이 Nothing이거나, 타입 a인 무언가를 담은 Just일 수 있다는 것을 나타내요.
Maybe 값을 만드는 것은 두 생성자 Nothing과 Just 중 하나를 통해서 해요.
Maybe의 내용을 읽는 것은 패턴 매칭을 통해 해요.
matthieu : Maybe String
matthieu = Just "Matthieu"
anon : Maybe String
anon = Nothing
sayHello : Maybe String -> String
sayHello maybeName =
case maybeName of
Nothing -> "Hello, World!"
Just someName -> "Hello, " ++ someName ++ "!"
sayHello matthieu
--> "Hello, Matthieu!"
sayHello anon
--> "Hello, World!"
Maybe 모듈에는 Maybe 타입을 다루는 유용한 함수들도 많이 있어요.
sayHelloAgain : Maybe String -> String
sayHelloAgain name = "Hello, " ++ Maybe.withDefault "World" name ++ "!"
capitalizeName : Maybe String -> Maybe String
capitalizeName name = Maybe.map String.toUpper name
capitalizeName matthieu
--> Just "MATTHIEU"
capitalizeName anon
--> Nothing
이 연습 문제에서는 롤플레잉 게임의 메커니즘을 구현해요. 플레이어의 캐릭터는 다음과 같은 타입으로 표현해요:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
이 게임의 플레이어는 주문을 시전하려면 먼저 레벨 10에 도달해 마나 풀을 해금해야 해요. 이 게임에서 두 가지 기능, 즉 부활 메커니즘과 주문 시전 메커니즘을 작업해요.
introduce 함수의 내용을 작성해요.
은신한 플레이어는 이름을 숨기고 있을 수 있으며, 이 경우 "Mighty Magician"으로 소개해요.
그렇지 않으면 자기 이름으로 자신을 소개해요.
introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
--> "Mighty Magician"
introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
--> "Merlin"
revive 함수는 플레이어의 캐릭터가 실제로 죽었는지(체력이 0이 되었는지) 확인해야 해요.
죽었다면 체력이 100인 새로운 Player 인스턴스를 반환해요.
그렇지 않으면, 즉 플레이어의 캐릭터가 죽지 않았다면 revive 함수는 Nothing을 반환해요.
플레이어의 레벨이 10 이상이면 마나도 100인 상태로 함께 부활해요.
플레이어의 레벨이 10 미만이면 마나는 Nothing이어야 해요.
revive 함수는 플레이어의 레벨을 그대로 유지해야 해요.
deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }
revive deadPlayer
--> Just { name = Nothing, level = 2, health = 100, mana = Nothing }
체력이 1 이상인 플레이어에게 revive 메서드를 호출하면 함수는 Nothing을 반환해야 해요.
alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }
revive alivePlayer
--> Nothing
castSpell 함수는 주문에 드는 마나를 나타내는 Int와 Player를 인자로 받아요.
갱신된 플레이어와 시전한 주문이 입히는 피해량을 반환해요.
주문 시전에 성공하면 주문의 마나 비용 두 배에 해당하는 피해를 입혀요.
하지만 플레이어의 마나가 부족하면 아무 일도 일어나지 않아요. 플레이어는 변하지 않고 피해도 입지 않아요.
플레이어가 마나 풀조차 없다면, 주문을 시전하려 해도 주문의 마나 비용만큼 체력이 감소하고 피해는 입히지 않아요.
wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }
( updatedWizard, damage ) = castSpell 14 wizard
updatedWizard.mana --> Just 16
damage --> 28
Exercism에 가입하고 Elm 트랙을 개념 28개연습 문제 110개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.