LearnApplyShare

[elm study] Types

December 17, 2019 - [elm, type]

타입선언

함수 정의시 아래와 같이 타입을 선언한다

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

Ref

https://guide.elm-lang.org/