在Ocaml中签署一个函数的声明

时间:2011-07-18 12:51:48

标签: function ocaml

我已经定义了如下函数:

let ff (f1: a_function) (f2: a_function) (v0: type1) (v1: type2): type3 = ...

另外一个功能如下:

let f: type1 -> type2 -> type3 = ff f1 f2

但是下面的另一个声明不起作用:

let f (v0: type1) (v1: type2): type3 = ff f1 f2

错误消息是:

Error: This expression has type
         type1 -> type2 -> type3
       but an expression was expected of type type3

我一直认为let f: type1 -> type2 -> type3let f (v0: type1) (v1: type2): type3相同。谁能告诉我为什么第一个声明有效而不是第二个?

非常感谢

PS1:我的关键问题是let f (v0: type1) (v1: type2): type3 = ff f1 f2f type1 -> type2 -> type3的类型不是?

如果let f (v0: type1) (v1: type2): type3 = ff f1 f2let f (v0: type1) (v1: type2): type3 = ff f1 f2返回相同类型的f,这两个签名之间有什么区别?

2 个答案:

答案 0 :(得分:3)

嗯,在您对f的定义中,您说它需要两个类型type1type2的参数,并返回类型type3的结果。所以身体应该有type3。相反,它的类型为type1 -> type2 -> type3,您可以从f的定义中看到,这就是编译器告诉您的内容。

也许你的意思是:

let f (v0: type1) (v1: type2): type3 = ff f1 f2 v0 v1

考虑到您的PS,f的类型不是您所说的,因为f未进行类型检查。我试着回答上面的原因。如果你省略了f这样的返回类型:

let f' (v0: type1) (v1: type2) = ff f1 f2

然后f'的类型为type1 -> type2 -> type1 -> type2 -> type3

答案 1 :(得分:0)

您的第二个定义的参数v0v1悬空。另一方面,该声明有效:

module type TimurTest =
  sig
    type type1
    type type2
    type type3
    type functional1
    type functional2
    val f1 : functional1
    val f2 : functional2
    val ff : functional1 -> functional2 -> type1 -> type2 ->type3
  end

module MyTest(M:TimurTest) =
  struct
    let f : M.type1 -> M.type2 -> M.type3 = M.ff M.f1 M.f2
    let f (v0: M.type1) (v1: M.type2) : M.type3 = M.ff M.f1 M.f2 v0 v1
    let g (v0: M.type1) (v1: M.type2) = M.ff M.f1 M.f2
  end

最后一行回答你的PS(注意我没有指定g的返回类型,让编译器推断它应该是什么):因为它的定义忽略了参数v0和{{ 1}},v1的{​​{3}}含义为其赋予g (v0:type1) (v1:type2) = ff f1 f2类型。基本上,你需要两个额外的参数,它们将丢弃它们的值(不将它们传递给type1 -> type2 -> type1 -> type2 -> type3,这将需要它自己的两个)。

事实上,在声明上述模块时,编译器的部分响应是:

ff f1 f2