2016-10-04 4 views
4

JS에서 배경 지식을 가진 엘름을 배우려고하고 강하게 그리고 정적으로 타입 된 언어에서 거의 경험하지 못했을 때, 나는 주요한 어려움이 타입 문법 (그리고 어떤 타입이 일반적으로 엘름에서 유용하게 사용되는지) . 불행히도, 나는 docs이이 점에서 매우 도움이되지 않는다는 것을 안다. 내가 여기에 간단한 예를 들자면 경우Elm의 유형 이해하기

: http://elm-lang.org/examples/buttons 라인 :

type Msg = Increment | Decrement 

는 "인"으로 노동 조합 유형 Msg을 정의하거나 Increment 또는 Decrement. IncrementDecrement도 유형 인 것으로 보입니다. 정확히 무엇입니까? (이 예제의 다른 곳에서는 정의되지 않았고 사전 정의 된 유형도 없습니다.)

그런 다음 onClick 인수로 view 함수에 사용됩니다. 이제 그들은 일종의 "메시지"(그것이 의미하는 것이 무엇이든)처럼 행동하는 것처럼 보입니다. JS에서 이것은 아마도 각각의 경우에 (가변적 인) 변수에 값을 할당함으로써 성취 될 것입니다 - 당연히 Elm 방식 일 수는 없습니다. 그렇다면 형식이 불변의 주제와 관련되어 작동하는 방식은 무엇입니까?

view 기능 : (누군가가 유용한 링크를 가리 수 있다면, 감사합니다!)

view model = 
    div [] 
    [ button [ onClick Decrement ] [ text "-" ] 
    , div [] [ text (toString model) ] 
    , button [ onClick Increment ] [ text "+" ] 
    ] 

나는이 생각이 잠재적으로 폭 넓은 주제를 엽니 다하지만 내 질문은 : Increment 여기 Decrement을 무엇입니까? 그들이 엘름 타입 시스템에 어떻게 들어 맞습니까?

+1

느릅 나무 안내서에는 [연합 유형 여기] (https://guide.elm-lang.org/types/union_types.html)에 대한 자세한 토론이 있습니다. –

+0

정의 된 공용체 타입'Msg'는 예제의 다른 곳에서 사용되지 않습니다. 우리는'update' 함수에서'case' 문을 사용할 수 있도록 이렇게 정의해야합니까? –

+1

다른 함수들은이 예제에서 주석을 달지 않았기 때문에 다른 곳에서는'Msg'를 볼 수 없습니다. (엘름에서는 그렇지 않습니다. 그러나 함수에 주석을다는 것이 매우 유용 할 수 있습니다). 'Model'이'Int'의 타입 별명이라고 가정하면, 타입 주석은 다음과 같아야합니다.'view : model -> Html Msg'과'update : Msg -> Model -> Model' –

답변

3

IncrementDecrement은 데이터 생성자입니다. 당신은 그것들을 OO 생성자라고 생각할 수 있습니다. 매개 변수를 가질 수 있으며 더 중요한 것은 따로 구분할 수 있습니다.

당신은 실제로 그것이 메시지라는 것이 맞습니다. 매개 변수가 없으므로 열거 형 값과 다르지 않습니다. 값이 불변이라는 사실은이 값과 거의 관련이 없습니다. C/C++/Java는 또한 열거 형을 지원합니다.

이 특정 경우에 Msgboolean의 멋진 이름으로 생각할 수도 있습니다.

합계 유형은 실제로 대부분 C의 공용체 유형과 유사합니다. 차이점은 Elm에는 옵션 중 어떤 것이 저장되어 있는지입니다. 느릅 나무는 하스켈로부터 이러한 개념을 취합니다.

+0

나는 최근에 하스켈을 배우기 시작했습니다. , 나는 실제로 Elm의 구문의 많은 부분이 어디에서 왔는지를 깨달았을 때, Elm을 걸려 넘어지게 만들려고 동기를 부여 받았습니다. 저는 하스켈에서 노동 조합을 대수 데이터 타입이라고 믿습니다. 어쨌든, 나는 탈선한다 - 좋은 대답! –