сигнатуры / типы в функциональном программировании (OCaml)

Я начал изучать функциональное программирование (OCaml), но не понимаю одной важной темы о fp: сигнатуры (я не уверен, что это » са собственное имя). Когда я что-то печатаю и компилирую с помощью ocaml, я получаю, например:

# let inc x = x + 1 ;;
val inc : int -> int = <fun>

Это тривиально, но я не знаю, почему это:

let something f g a b = f a (g a b)

дает результат:

val something : (’a -> ’b -> ’c) -> (’a -> ’d -> ’b) -> ’a -> ’d -> ’c = <fun>

Я полагаю, что эта тема абсолютно базовая of fp для многих из вас, но я прошу помощи здесь, потому что я не нашел ничего в Интернете о подписях в OCaml (есть несколько статей о подписях в Haskell, но нет пояснений).

Если эта тема каким-то образом сохранится, я размещу здесь несколько функций, подписи которых меня запутали:

# let nie f a b = f b a ;; (* flip *)
val nie : (’a -> ’b -> ’c) -> ’b -> ’a -> ’c = <fun>

# let i f g a b = f (g a b) b ;;
val i : (’a -> ’b -> ’c) -> (’d -> ’b -> ’a) -> ’d -> ’b -> ’c = <fun>


# let s x y z = x z (y z) ;;
val s : (’a -> ’b -> ’c) -> (’a -> ’b) -> ’a -> ’c = <fun>

# let callCC f k = f (fun c d -> k c) k ;;
val callCC : ((’a -> ’b -> ’c) -> (’a -> ’c) -> ’d) -> (’a -> ’c) -> ’d = <fun>

Спасибо за помощь и объяснение.

9
задан lever7 17 November 2010 в 00:28
поделиться