2015-08-13 2 views
0

Пусть все, что я знаю о функции является то, что она имеет тип:SML: Определение типа функции

int list -> int * string -> int 

Есть ли способ заранее знать, означает ли это:

(int list -> int * string) -> int или int list -> (int * string -> int)?

Спасибо,

bclayman

ответ

3

-> прав ассоциативная в аннотации типа SML, так int list -> (int * string -> int) правильно.

Рассмотрим простой эксперимент в РЕПЛ:

- fun add x y = x+y; 
val add = fn : int -> int -> int 

add является функцией, которая, когда кормили Int возвращает функцию, а именно функцию, которая посылает y к x + y - следовательно, его тип int -> (int ->int). Это не функция, которая, когда функция fed из ints в ints выводит int (что будет (int -> int) -> int). Несколько искусственный пример позднего рода вещи:

- fun apply_to_zero_and_increment f = 1 + f(0); 
val apply_to_zero_and_increment = fn : (int -> int) -> int 

Если я определяю fun g(x) = x + 5 затем apply_to_zero_and_increment g возвращается 6.

Смежные вопросы