Это выражение OCaml имеет тип своего аргумента, когда оно не было определено для AFAIK, и почему это другое выражение имеет «_a, а не» a? - PullRequest
0 голосов
/ 20 ноября 2018

Я понимаю, что

let apply f x = f x

имеет тип

('a -> 'b) -> 'a -> 'b

apply - это функция, которая принимает функцию f и аргумент x и возвращает f применяется к x.Итак, если f x имеет тип 'b, а x имеет тип 'a, то f должен иметь тип 'a -> 'b, поэтому вы объединяете их, чтобы получить ('a -> 'b) -> 'a -> 'b.Я понимаю.По расширению, let identity f = f имеет тип 'a -> 'a, поскольку он принимает элемент типа 'a' и возвращает тот же элемент типа 'a, поэтому он имеет тип 'a -> 'a.Я понимаю, что

let bf b f = if (f b) then f else (fun x -> b)

имеет тип

bool -> (bool -> bool) -> bool -> bool

f b должен иметь тип bool, и поэтому f равен 'a -> bool и bимеет тип 'a.f типа 'a -> bool имеет тот же тип, что и fun x -> b, то есть 'c -> 'a.Итак, 'c = 'a = bool, поэтому bf принимает bool, затем тип f, равный bool -> bool, и возвращает bool -> bool, для окончательного типа

bool -> (bool -> bool) -> bool -> bool

У меня естьчтобы найти тип

let t1 = apply bf

того же типа, что и apply bf.

Итак, apply f равен 'a -> 'a, если f имеет тип 'a, поэтомуЯ ожидал бы, что apply bf будет иметь type(bf) -> type(bf), что будет

bool -> (bool -> bool) -> bool -> bool -> bool -> (bool -> bool) -> bool -> bool

Очевидно, apply bf имеет тип bool -> (bool -> bool) -> bool -> bool, и я не понимаю, почему это так.

Я также не вижу разницы между типом 'a и типом '_a.

Если let apply f x = f x, то apply имеет тип ('a -> 'b) -> 'a -> 'b, и let app2 = apply apply имеет тип

('_a -> '_b) -> '_a -> '_b

Если бы кто-то мог помочь мне понять, почему это так, и я не чувствую себя потерянным, просто отправив ответы без понимания, это будет оценено.

1 Ответ

0 голосов
/ 20 ноября 2018

Я ожидаю, что у bf будет тип (bf) -> type (bf)

Это неправильно.Во-первых, обратите внимание, что правило ввода для приложения:

f   : A -> B
x   : A
-------------
f x : B

В вашем случае присутствует полиморфизм, но идея та же:

apply    : ('a -> 'b) -> ('a -> 'b)
bf       :   A -> B
------------------------------------
apply    : (A -> B) -> (A -> B)
bf       :  A -> B
------------------------------------
apply bf :  A -> B

Я тоже неполучить разницу между типом «a» и типом «_a».

Обозначение '_a представляет собой фиктивный тип, и последствие «ограничения по значению», которое гласит, что только выражения со значениями могут быть полиморфными,См http://mlton.org/ValueRestriction

...