1
Я почесал голову, чтобы выяснить подпись этой функцииКак определяется тип этой функции?
let make_rec f_norec =
let rec f x = f_norec f x in
f
, который должен быть
val make_rec : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
.
Обратите внимание, что существует странное рекурсивное определение. Определенно, мне не хватает знаний. Может ли кто-нибудь показать мне, как вычислить тип функции (как это делает система вывода типов)?
Большое спасибо.
Большое спасибо. Это довольно педагогично. – tfboy
Что я не понимаю, почему последнюю пару круглых скобок можно опустить? – Indicator
@Indicator. Как работает оператор right associative ->, и это делается так, потому что, если у вас есть функция 'f :: a -> b -> c', это означает, что если вы укажете только аргумент a , вы получаете функцию 'b -> c'. Это карри. OTOH, если тип '(a -> b) -> c', это означает, что у вас есть одна функция аргумента, которая принимает другую функцию' a -> b' и возвращает 'c'. – Ingo