我已经定义了如下函数:
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 -> 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
,这两个签名之间有什么区别?
答案 0 :(得分:3)
嗯,在您对f
的定义中,您说它需要两个类型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
。
答案 1 :(得分:0)
您的第二个定义的参数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
的返回类型,让编译器推断它应该是什么):因为它的定义忽略了参数v0
和{{ 1}},v1
的{{3}}含义为其赋予g (v0:type1) (v1:type2) = ff f1 f2
类型。基本上,你需要两个额外的参数,它们将丢弃它们的值(不将它们传递给type1 -> type2 -> type1 -> type2 -> type3
,这将需要它自己的两个)。
事实上,在声明上述模块时,编译器的部分响应是:
ff f1 f2