Чтобы понять этот тип sgnature, вам необходимо сначала понять currying.
Определение как
fun sum a b = a + b
имеет тип int -> int -> int
.
Это функция переменная (целое число), где возвращаемое значение само является функцией, которая отправляет ints в int.
Например, val f = sum 1
присваивает f
функцию, которая добавляет один на его вход (другими словами, функция преемника), так что, например, f 5
принимает значение 6.
На практике такие функции часто используемых как sum 3 4
, но что там происходит не Прохождение 2 значений до sum
. Скорее, передается одно значение 3, которое возвращает функцию, и это возвращаемое значение затем применяется к 4. Таким образом, sum 3 4
следует проанализировать как (sum 3) 4
, а не sum (3,4)
- это будет ошибка типа.
Обратите внимание, что это в корне отличается от чего-то вроде
fun add (a,b) = a + b
который является функцией двух переменных, она имеет тип int * int -> int
, которая отличается от типа SUM о int -> int -> int
.Последнее не является синтаксическим сахаром для первого, но вместо этого имеет принципиально другую семантику.
При чтении чего-либо такого, как int -> int -> int
, вы должны прочитать его как право-ассоциативный. Другими словами, это то же самое, что и int -> (int -> int)
.
Другое дело, что с ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
является использование переменных 'a, 'b
. Это означает, что тип, который вы пытаетесь проанализировать, имеет функцию более высокого порядка. Он 'a
и 'b
может представлять любой тип.
Собираем все вместе, функция, f
, типа ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
это функция, которая принимает в качестве входных данных любой функции, тип которого имеет вид 'a * 'b -> 'b
(функция двух переменных, тип возврата является тип второй переменной) , Возвращаемое значение f
является функцией вида 'b -> 'a list -> 'b
. Эта последняя функция, которая принимает элемент типа 'b
и возвращает функцию, которая посылает 'a lists
к объектам типа 'b
Вы можете суммировать его, говоря, что f
функция кэрри которая принимает функцию типа ('a * 'b -> 'b)
, значение типа 'b
, список значений типа 'a
и возвращает значение типа 'b
. То есть достаточно точное, но не скользит в мышление его как эквивалент функции типа
('a * 'b -> 'b) * 'b * 'a list -> 'b
Кстати, два из наиболее полезных функций в SML, foldl
и foldr
имеют типа ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
, так что это не просто академическое упражнение. Возможность распаковывать такие описания типов - это ключ к возможности правильно использовать такие функции.
Функция принимает только один аргумент (который сам по себе является функцией), поэтому использование слов «первым», «вторым» и т. Д. Отражает недоразумение. Кроме того, возвращаемое значение является функцией типа ''b ->' списка -> 'b', а не элемента типа' b'. Не интерпретируйте валютную функцию, как если бы она была не-карри. –