繁体   English   中英

Ocaml 中 function 声明的签名

[英]Signature of the declaration of a function in Ocaml

我已经定义了一个 function,如下所示:

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

另一个 function 如下作品:

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 f2 ,不是f type1 -> type2 -> type3的类型吗?

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

好吧,在您的f定义中,您说它需要两个 arguments 类型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

Arguments v0 ,您的第二个定义的v1悬空。 另一方面,此声明有效:

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的返回类型,让编译器推断它应该是什么):因为它的定义忽略了 arguments v0v1 ,所以g (v0:type1) (v1:type2) = ff f1 f2咖喱含义( g (v0:type1) (v1:type2) = ff f1 f2给它类型type1 -> type2 -> type1 -> type2 -> type3 基本上,您需要两个额外的 arguments 您将丢弃其值(而不是将它们传递给ff f1 f2 ,这将需要两个自己的值)。

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

      val g : M.type1 -> M.type2 -> M.type1 -> M.type2 -> M.type3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM