Я пытаюсь обвести голову в виде вывода вывода OCaml.Тип вывода в OCaml
Например:
# let f x = x [];;
val f : ('a list -> 'b) -> 'b = <fun>
имеет смысл для меня. Функция val f принимает функцию x, которая принимает список типа a и возвращает что-то типа b. Затем f возвращает тип «b», так как он просто вызывает x.
Однако, как только мы получаем больше аргументов, я становлюсь более смущенным.
# let g a b c = a b c;;
val g : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c = <fun>
Могу ли я считать, что если функция имеет аргументы, то первые параметры вывода типа всегда будут аргументы? И если я назову a b c, это порядок ((a b) c) или (a (b c))?
# let rec h m n ls = match ls with
| [] -> n
| x::t -> h m (m n x) t;;
val h : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
Как для этого я запутался о том, как («а ->» Ь -> «а) ->» а был получен. Я вижу, что «b список соответствует переменной ls, а последний» a соответствует типу терминального символа n.
Спасибо так много!Это прояснилось для меня много. У меня просто было еще одно продолжение, если вы не возражаете ответить: что, если мы не знаем тип вывода и должны были выяснить только из уравнения? Как бы вы узнали, что m 2 arg a.k.a. x имеет тип «b» и не совпадает с «a? –
@ChangLiu Для простой функции, подобной вашей, вы можете сделать вывод, выполнив унификацию. Очень наивным образом присвойте '' m'' типа '' X'', '' n'' типа '' Y'', '' ls'' типа '' Z'' и т. Д. После этого , вы определяете уравнения для этих переменных и решаете уравнения для получения наиболее основных типов ('' 'a'',' '' b'', ...). Вы можете найти «Алгоритм W» для получения дополнительной информации о типе. Или, вы можете запрограммировать в OCaml больше, так что вы можете сделать вывод в своей голове быстрее :) – objmagic