Я понимаю, что
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
Если бы кто-то мог помочь мне понять, почему это так, и я не чувствую себя потерянным, просто отправив ответы без понимания, это будет оценено.