Использование чисел в качестве типов в Elm - PullRequest
2 голосов
/ 08 января 2020

Я изучаю вяз и пытаюсь использовать типы, чтобы лучше описать мой домен. Но я застрял здесь: я не могу использовать числовые литералы как псевдонимы типов / типов? Есть ли способ "elmi sh" сделать это?

module Main exposing (main)

import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)


type alias Model =
    { pos : Int }

type Up = 1
type Down = -1
type Direction = Up | Down

type Msg
    = Go Direction


initialModel : Model
initialModel =
    { pos = 0 }


update : Msg -> Model -> Model
update msg model =
    case msg of
        Go Up ->
            { model | pos = model.pos + Up }

        Go Down ->
            { model | pos = model.pos + Down }


view : Model -> Html Msg
view model =
    div []
        [ button [ onClick Go Up ] [ text "+1" ]
        , div [] [ text <| String.fromInt model.count ]
        , button [ onClick Go Down ] [ text "-1" ]
        ]


main : Program () Model Msg
main =
    Browser.sandbox
        { init = initialModel
        , view = view
        , update = update
        }

(ell ie ссылка: https://ellie-app.com/7HRDRKHRCFDa1)

1 Ответ

5 голосов
/ 08 января 2020

Чтобы использовать Up и Down с оператором +, они должны быть значениями, а не типами - значениями того же типа, что и другой операнд. Поэтому вместо этого определите их как константы типа Int:

up : Int
up = 1

down : Int
down = -1

Затем вы можете написать свою update функцию как:

update : Msg -> Model -> Model
update msg model =
    case msg of
        Go Up ->
            { model | pos = model.pos + up }

        Go Down ->
            { model | pos = model.pos + down }

Полный рабочий код см. это Ell ie. Единственное другое изменение, которое я сделал, было для ваших кнопок onClick - это должно быть onClick <| Go Up, чтобы сообщить компилятору, что Up является аргументом Go, а результат - аргументом onClick.

...