Объедините переменную универсального типа с другим существующим типом - PullRequest
0 голосов
/ 07 октября 2018

Есть строка из Руководство по вязу ниже:

Task.perform AdjustTimeZone Time.here

Я нашел следующие сигнатуры типов:

-- ∵
AdjustTimeZone :  Zone -> Msg
here           :                  Task x     Zone
perform        : (a    -> msg) -> Task Never a    -> Cmd msg 
-- ∴
perform AdjustTimeZone here :                        Cmd Msg

Как можно объединить Task x Zone с Task Never a?В частности, от x до Never сомнительно, а от Zone до a разумно.

1 Ответ

0 голосов
/ 07 октября 2018

Я не эксперт по выводу типов, но я не думаю, что правильно говорить, что "x объединяется в Never", и подозреваю, что это источник вашей путаницы.x и a - это переменные типа, которые объединяются в любом случае, если нет других ограничений, которые вступают в конфликт.Так что, a становится Zone, x становится Never, а не наоборот.

Вы также можете задаться вопросом, почему Time.here имеет тип Task x Zone вместо Task Never Zoneтак как, в конце концов, here должен знать, может ли это быть ошибкой.Я думаю, что это потому, что 1) это не имеет значения (для системы типов, хотя, конечно, это может быть полезно для пользователя), и 2) это делает его более простым для компоновки.

Такскажем, вы хотите упорядочить Time.here с некоторыми другими Task, которые могут ошибка.Task.andThen имеет тип (a -> Task x b) -> Task x a -> Task x b с переменной типа x (error), которая одинакова во всех Task s.Таким образом, если бы Time.here s был Task Never Zone, нам пришлось бы снабдить andThen функцией Zone -> Task Never b.И это, конечно, не сработает.

Я почти уверен, что вы могли бы просто сделать TasK.here |> Task.mapError never |> Task.andThen (\zone -> ...), но в этом нет необходимости, если тип ошибки остается переменной типа, а не ограничен Never.И это не проблема, поскольку Task.here не будет выдавать x с, поэтому не имеет значения, что именно объединяет.

...