List
является встроенным типом, принимая один параметр (другой тип) и означает « список, содержащий значения этого типа в качестве его элементов ». Таким образом, List (Int, Int)
- это список (Int, Int)
. Итак, что такое (Int, Int)
?
В целом любой (a, b)
является кортежем с элементами типа a
и типа b
. Кортеж немного похож на запись без имен полей, поэтому вы можете различать только элементы по их положению, однако в отличие от списка элементы могут быть разных типов. Итак, (Int, Int)
- это кортеж, содержащий два Int
s, где Int
- всего лишь целое число.
Таким образом, List (Int, Int)
- это список кортежей из двух целых чисел.
С TimePlot
у вас фактически есть два разных типа параметров - Scale
и List (Time, Int)
. Последнее должно теперь иметь смысл с учетом объяснения List (Int, Int)
- только кортеж имеет Time
в качестве своего первого типа вместо Int
.
Таким образом, TimePlot
принимает два типа параметров, и он становится TimePlot Scale (List (Time, Int))
.
В Elm и родственных языках, тип обозначение (и прикладная функция) определены таким образом, что любое выражение a b c d
означает a
с параметрами b
, c
и d
. Если c d
предназначен для одного параметра, он помещается в круглые скобки.
Как говорит Андреас, подумайте о тегах союза как о функциях - они действительно есть, на самом деле их называют «конструкторами типов». TimePlot
- это функция, принимающая Scale
и List (Time, Int)
и возвращающая Widget
. Normal
- это функция без параметров, которая возвращает Scale
и так далее.
Благодарим вас за подробное объяснение - это имеет смысл! Я думаю, что часть путаницы, с которой я столкнулся, заключалась в том, как используются круглые скобки, но ваше объяснение прояснило это! – wmock
другой связанный вопрос, но как бы вы интерпретировали аннотацию этого типа: 'String.toInt: String -> Результат String Int'? То, как я понимаю это, заключается в том, что функция toInt принимает 'String' как входную и возвращает значение типа' Result String Int', правильно? Однако, как выглядит правильное значение 'Result String Int'? – wmock
«Значение ошибки результата» - это тип, который указывает на результат операции. В этом случае 'error' является' String' и 'value' является' Int', поэтому, если операция не увенчалась успехом, вы получите 'String' - возможно, сообщение об ошибке - и если вы это делаете, вы получите' Int' , Это дискриминационный тип объединения, поэтому вы можете сопоставить шаблон с ним - ветка успеха - 'Ok', а ветвь ошибки -' Err'. См. Http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Result –