为匿名函数编写规范

时间:2014-11-26 20:54:45

标签: ocaml

我有匿名功能:

fun x -> x;;
- : 'a -> 'a = <fun>

如您所见,此函数接受任何类型的参数。我想指定具体类型,比如说int。 我知道我可以使用类型规范注释函数,但不知道它的语法。

获得对此语法的一些引用并使用此类注释扩展此示例会很有帮助。

感谢。

2 个答案:

答案 0 :(得分:3)

# fun (x: int) -> x;;
- : int -> int = <fun>
# 

这有效的原因是

  • 函数参数指定为模式。

  • patttern的另一种选择是:

    (pattern:typexpr)

模式语法在Section 6.6 of the OCaml manual中给出。

答案 1 :(得分:2)

最常见的形式是:

(fun x -> x : int -> int)

由于fun x -> x本身就是一个值,因此它可以使用类型进行注释,就像任何其他表达式一样。实际上,在这种类型的注释中你可以省略int之一,因为另一个可以由编译器推断:

(fun x -> x : int -> 'a) 

(fun x -> x : 'a -> int)

所有结果都会导致:

- : int -> int = <fun>

这也表明类型注释中的'a与签名中的'a具有不同的含义。在类型注释中,它代表“我不在乎,你决定”。这就是为什么类型注释的正确名称是类型约束的原因,因此您不是用类型注释表达式,而是为类型推理系统提供额外的约束。在这个例子中,你说的是:我有这个表达式,请推断它的类型,给它一个返回int的函数。

此外,您可以使用_而不是类型变量,就像对普通变量执行此操作一样:

(fun x -> x : _ -> int)

结果将是相同的。