我开始学习函数式编程(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>
我想对于你们中的许多人来说,这个话题绝对是函数式编程的基础,但我在这里寻求帮助,因为我在互联网上没有找到有关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>
感谢您的帮助和解释。