수색…


튜플

튜플은 모든 유형의 값 목록으로 정렬됩니다.

(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"
    }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow