我开始学习函数式编程(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>
我想,对于你们中的许多人来说,这个主题绝对是 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>
感谢您的帮助和解释。