Я хочу определить функцию, которая принимает необязательный аргумент, который является функцией ('a ->' b). Значение по умолчанию должно быть тождеством, которое на самом деле ('a -> 'a)
, но я не вижу причин, почему он не должен быть совместим с более общим ('a -> 'b)
. Когда я пытаюсь:как заставить OCaml вывести более общий тип?
let optional_apply ?f i =
match f with
| None -> i + 4
| Some fn -> fn (i + 4)
Я всегда получаю узкий тип ?f:(int -> int) -> int -> int
. Но я хочу сохранить f как int -> 'b
. Что я могу сделать? Или это просто неудобно, так как optional_apply
не будет иметь определенный тип? Если да, то как мне получить аналогичную функциональность?
Итак, способ думать о необязательных аргументах - это типы 'option', которые фиксируются во время определения функции. Я ошибочно представлял себе что-то вроде ленивой типизирующей конструкции, с которой не нужно смотреть, пока это не понадобится. Но это, вероятно, вздор в контексте Окамла. – user3240588
Ваш второй пример - просвещающий, спасибо! – user3240588