Elm Language
데이터 수집 : 튜플, 레코드 및 사전
수색…
튜플
튜플은 모든 유형의 값 목록으로 정렬됩니다.
(True, "Hello!", 42)
Tuple의 구조를 변경하거나 값을 업데이트하는 것은 불가능합니다.
Elm의 Tuples는 기본 데이터 유형으로 간주되므로 튜플을 사용하기 위해 모듈을 가져올 필요가 없습니다.
값 액세스
기본 모듈에는 패턴 매칭을 사용하지 않고 길이가 2 인 튜플의 값에 액세스하기위한 두 가지 도우미 함수가 있습니다 ( a, b ) .
fst (True, "Hello!") -- True
snd (True, "Hello!") -- "Hello!"
길이가 더 긴 튜플의 액세스 값은 패턴 일치를 통해 수행됩니다.
패턴 매칭
튜플은 패턴 일치와 함께 사용하면 매우 유용합니다.
toggleFlag: (Sting, Bool) -> (Sting, Bool)
toggleFlag (name, flag) =
(name, not flag)
튜플에 대한 설명
튜플은 comparable 데이터 유형의 7 개 미만의 값을 포함합니다.
사전
사전은 Dict 핵심 라이브러리에서 구현됩니다.
고유 키를 값에 매핑하는 사전입니다. 키는 모든 비교 가능한 유형이 될 수 있습니다. 여기에는 Int, Float, Time, Char, String 및 유사한 유형의 튜플 또는 목록이 포함됩니다.
삽입, 제거 및 쿼리 작업은 모두 O (log n) 시간이 걸립니다.
튜플 및 레코드와 달리 사전은 구조를 변경할 수 있습니다. 즉, 키를 추가하거나 제거 할 수 있습니다.
키로 값을 갱신 할 수 있습니다.
동적 키를 사용하여 값에 액세스하거나 업데이트 할 수도 있습니다.
값 액세스
Dict.get 함수를 사용하여 사전에서 값을 검색 할 수 있습니다.
Dict.get 유형 정의 :
get : comparable -> Dict comparable v -> Maybe v
존재하지 않는 키에 의해 값을 얻으려고 시도 할 수 있기 때문에 항상 Maybe v 반환합니다.
import Dict
initialUsers =
Dict.fromList [ (1, "John"), (2, "Brad") ]
getUserName id =
initialUsers
|> Dict.get id
|> Maybe.withDefault "Anonymous"
getUserName 2 -- "Brad"
getUserName 0 -- "Anonymous"
값 업데이트 중
사전에 대한 업데이트 작업은 Maybe.map 을 사용하여 수행됩니다. 요청 된 키가 없을 수 있기 때문입니다.
import Dict
initialUsers =
Dict.fromList [ (1, "John"), (2, "Brad") ]
updatedUsers =
Dict.update 1 (Maybe.map (\name -> name ++ " Johnson")) initialUsers
Maybe.withDefault "No user" (Dict.get 1 updatedUsers) -- "John Johnson"
기록
레코드는 키 - 값 쌍의 집합입니다.
greeter =
{ isMorning: True
, greeting: "Good morning!"
}
존재하지 않는 키로 값에 액세스하는 것은 불가능합니다.
Record의 구조를 동적으로 수정하는 것은 불가능합니다.
레코드는 상수 키로 만 값을 업데이트 할 수 있습니다.
값 액세스
가능한 런타임 오류를 방지하기 위해 동적 키를 사용하여 값에 액세스 할 수 없습니다.
isMorningKeyName =
"isMorning "
greeter[isMorningKeyName] -- Compiler error
greeter.isMorning -- True
값에 액세스하기위한 대체 구문을 사용하면 값을 추출 할 수 있으며 레코드를 통해 파이핑 할 수 있습니다.
greeter
|> .greeting
|> (++) " Have a nice day!" -- "Good morning! Have a nice day!"
확장 형식
때로는 매개 변수의 서명을 사용하여 전달하는 레코드 유형을 함수로 제한 할 수 있습니다. 레코드 유형을 확장하면 수퍼 유형에 대한 아이디어가 필요하지 않습니다. 다음 예제에서는이 개념을 구현하는 방법을 보여줍니다.
type alias Person =
{ name : String
}
type alias Animal =
{ name : String
}
peter : Person
peter =
{ name = "Peter" }
dog : Animal
dog =
{ name = "Dog" }
getName : { a | name : String } -> String
getName livingThing =
livingThing.name
bothNames : String
bothNames =
getName peter ++ " " ++ getName dog
레코드를 한 단계 더 확장하고 다음과 같이 할 수도 있습니다.
type alias Named a = { a | name : String }
type alias Totalled a = { a | total : Int }
totallyNamed : Named ( Totalled { age : Int })
totallyNamed =
{ name = "Peter Pan"
, total = 1337
, age = 14
}
우리는 이제이 부분 유형을 함수에서 전달하는 방법을 갖습니다.
changeName : Named a -> String -> Named a
changeName a newName =
{ a | name = newName }
cptHook = changeName totallyNamed "Cpt. Hook" |> Debug.log "who?"
값 업데이트 중
Elm에는 레코드 업데이트를위한 특별한 구문이 있습니다 :
model =
{ id: 1
, score: 0
, name: "John Doe"
}
update model =
{ model
| score = model.score + 100
| name = "John Johnson"
}