Я не эксперт по выводу типов, но я не думаю, что правильно говорить, что "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
с, поэтому не имеет значения, что именно объединяет.