【发布时间】:2010-11-17 00:15:36
【问题描述】:
我开始学习函数式编程 (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 的基础知识,但我在这里寻求帮助,因为我在 Internet 上没有找到关于 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>
感谢您的帮助和解释。
【问题讨论】:
-
术语注释(可以帮助您进行文献搜索):Ocaml 中的“签名”通常意味着其他含义,即类型的模拟,但用于模块而不是基本表达式和值。您所询问的内容有时称为“类型签名”,但当有变量时,通常只是“类型”或“类型方案”。
标签: functional-programming ocaml signature