[elm study] Types
타입선언
함수 정의시 아래와 같이 타입을 선언한다
hypotenuse : Float -> Float -> Float
hypotenuse a b =
sqrt (a^2 + b^2)
-- hypotenuse 3 4 == 5
-- hypotenuse 5 12 == 13
타입 변수
ts의 generic 과 비슷하게 일반적인 타입 형태(list)를 정의할 수 있다
> List.reverse
<function> : List a -> List a
> List.reverse [ "a", "b", "c" ]
["c","b","a"] : List String
> List.reverse [ True, False ]
[False,True] : List Bool
제약이 있는 타입변수
관련있는 타입들끼리 묶어 놓은 타입들
> negate
<function> : number -> number
- number: Int | Float
- appendable: String | List a
- comparable: Int | Float | Char | String | lists | tuples
- compappend: String | List
타입 별칭
type alias User =
{ name : String
, age : Int
}
-- WITH ALIAS
isOldEnoughToVote : User -> Bool
isOldEnoughToVote user =
user.age >= 18
-- WITHOUT ALIAS
isOldEnoughToVote : { name : String, age : Int } -> Bool
isOldEnoughToVote user =
user.age >= 18
사용자정의 타입
사용자정의 타입 UserStatus 정의
type UserStatus
= Regular
| Visitor
type alias User =
{ status : UserStatus
, name : String
}
thomas = { status = Regular, name = "Thomas" }
kate95 = { status = Visitor, name = "kate95" }
위 내용은 아래와 같이 사용할 수 있음
> type User
| = Regular String Int
| | Visitor String
|
> Regular
<function> : String -> Int -> User
> Visitor
<function> : String -> User
> Regular "Thomas" 44
Regular "Thomas" 44 : User
> Visitor "kate95"
Visitor "kate95" : User
>
Msg 타입 정의를 보자
PressedEnter, ChangedDraft, ReceivedMessage, ClickedExit 들은 그냥 적절히 네이밍한 사용자정의 타입인거다.
그리고 그것들은 특정 데이터구조를 가질 수 있다.
Awesome!
type Msg
= PressedEnter
| ChangedDraft String
| ReceivedMessage { user : User, message : String }
| ClickedExit
패턴매칭
아래와 같이 User 타입이 정의되었다면
type User
= Regular String Int
| Visitor String
User 타입을 사용하는 toName 함수를 구현할 수 있다
toName : User -> String
toName user =
case user of
Regular name age ->
name
Visitor name ->
name
-- toName (Regular "Thomas" 44) == "Thomas"
-- toName (Visitor "kate95") == "kate95"
toName 함수에서 age 는 실질적으로 사용되지 않으므로 아래와 같이 처리할 수 있다
toName : User -> String
toName user =
case user of
Regular name _ ->
name
Visitor name ->
name