[英]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 -> type3
与let 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 f2
和let f (v0: type1) (v1: type2): type3 = ff f1 f2
返回相同类型的f
,它们之间有什么区别2个签名?
好吧,在您的f
定义中,您说它需要两个 arguments 类型type1
和type2
并返回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 v0
和v1
,所以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.