2016-02-03 3 views
2

Я пытаюсь обвести голову в виде вывода вывода 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.

ответ

3

Можно ли предположить, что если функция имеет аргументы, то первыми параметрами вывода типа всегда будут аргументы?

Да, первый параметр типа функции - это тип его первого аргумента.

И если я называю b c, это порядок ((a b) c) или (a (b c))?

Заказ ((a b) c) (вы можете думать в этом простом способе)

Как для этого я запутался о том, как («а ->» Ь -> «а) -> 'a был получен. Я вижу, что «b список соответствует переменной ls, а последний» a соответствует типу терминального символа n.

Вы правы. ls имеет тип 'b list и n имеет тип 'a.

Давайте думать о типе m:

  1. Вы знаете n имеет тип 'a, так что вы можете получить (m n x) также имеет тип 'a
  2. Вы знаете ls имеет тип 'b list, так что вы можете получить x имеет тип 'b
  3. m принимает два аргумента типа 'a и типа 'b, а также производит результат типа 'a. Так, m имеет тип 'a -> 'b -> 'a

Таким образом, вся функция имеет тип ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a

+0

Спасибо так много!Это прояснилось для меня много. У меня просто было еще одно продолжение, если вы не возражаете ответить: что, если мы не знаем тип вывода и должны были выяснить только из уравнения? Как бы вы узнали, что m 2 arg a.k.a. x имеет тип «b» и не совпадает с «a? –

+0

@ChangLiu Для простой функции, подобной вашей, вы можете сделать вывод, выполнив унификацию. Очень наивным образом присвойте '' m'' типа '' X'', '' n'' типа '' Y'', '' ls'' типа '' Z'' и т. Д. После этого , вы определяете уравнения для этих переменных и решаете уравнения для получения наиболее основных типов ('' 'a'',' '' b'', ...). Вы можете найти «Алгоритм W» для получения дополнительной информации о типе. Или, вы можете запрограммировать в OCaml больше, так что вы можете сделать вывод в своей голове быстрее :) – objmagic

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