Составные типы и HTML на входе - PullRequest
0 голосов
/ 22 ноября 2018

Неделю назад я наконец-то нашел способ разделить свои сообщения по различным категориям ( Вот такой вопрос, где я получил свой ответ )

Теперь я реализовал это решение:

type Msg 
    = AMsg AMsg
    | BMsg BMsg
    | CMsg CMsg

и затем я определил AMsg следующим образом

type AMsg
    = ActionOne Int String
    | ActionTwo Int

Все прекрасно работает, кроме случаев, когда я использую ActionOne с onInput Html.Event

input [onInput (AMsg (ActionOne model.id))] []

Эта ошибка говорит мне, что onInput нуждается в типе String -> Msg, но получает тип AMsg.

Это будет прекрасно работать, если я, например, использую onClick, и передам второй аргумент сам

input [onClick (AMsg (ActionOne model.id "hello"))] []

Но так как мне нужно использовать onInput, и именно это передает второй параметр String в ActionOne, я застрял.Если я изменю свои типы, чтобы приспособиться к этому

type Msg 
    = AMsg AMsg String
    | BMsg BMsg
    | CMsg CMsg

type AMsg
    = ActionOne Int
    | ActionTwo Int

Это работает, но затем я заставляю ActionTwo также взять строку, которую я не хочу.

В противном случае я застрял, указав ActionOne непосредственно под Msg

type Msg 
        = AMsg AMsg
        | BMsg BMsg
        | CMsg CMsg
        | ActionOne Int String

type AMsg
    = ActionTwo Int

Мне действительно важно разделить Msgs на разные категории - если я хочу использовать elm для более крупного проекта, это кажется довольно важным длямне.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Чтобы немного расширить ответ Мэтта МакГенри:

Иногда, когда у вас есть более сложные случаи, это помогает более тщательно продумать, что на самом деле означает обычный более простой синтаксис.Если у вас есть базовый случай

type Msg
    = GotInput String
...
input [onInput GotInput] []

, тогда GotInput - это функция String -> Msg.Вы также можете записать это явно как:

input [onInput (\str -> GotInput str)] []

Так что здесь вы даете onInput функцию, которая принимает параметр str и затем возвращает GotInput str.

Теперь, когда у вас естьЭта базовая функция может стать более понятной, как расширить это на более сложный случай - вы просто измените возвращаемое значение и включите в него str в правильном месте:

input [onInput (\str -> (AMsg (ActionOne model.id str)))] []
0 голосов
/ 22 ноября 2018

Функция, которую вы передаете onInput, должна иметь тип String -> msg (или, более конкретно, в вашем случае, String -> Msg.)

Это можно сделать с помощьюиспользуя лямбду:

input [onInput (\str -> (AMsg (ActionOne model.id str)))] []

Вы также можете использовать композицию функций (функция <<), чтобы достичь того же, не говоря явно о параметре str:

input [ onInput <| AMsg << ActionOne model.id ]
...