Types 函数式语言是否使用调用方的信息进行类型推断?

Types 函数式语言是否使用调用方的信息进行类型推断?,types,functional-programming,type-inference,ml,Types,Functional Programming,Type Inference,Ml,考虑函数f1和f2,例如Haskell或ML。假设f2调用f1。类型推断是否只使用f1可以调用的信息,这相当于只查看f1的定义。或者它还研究了f2在对f1进行类型推断时如何调用f1。例如,调用f1时,f2可能会传入文本,这将限制f1的参数类型。类型系统不使用有关调用方的信息来确定函数可以处理的类型——这将是过度限制,并且通常无法实现。例如,假设(哈斯克尔) 从此将头的类型从[a]->a限制为[Int]->Int;之后,head[“hello”,“world”]将是不可能的,我们必须重新定义hea

考虑函数f1和f2,例如Haskell或ML。假设f2调用f1。类型推断是否只使用f1可以调用的信息,这相当于只查看f1的定义。或者它还研究了f2在对f1进行类型推断时如何调用f1。例如,调用f1时,f2可能会传入文本,这将限制f1的参数类型。

类型系统不使用有关调用方的信息来确定函数可以处理的类型——这将是过度限制,并且通常无法实现。例如,假设(哈斯克尔)

从此将
头的类型从
[a]->a
限制为
[Int]->Int
;之后,
head[“hello”,“world”]
将是不可能的,我们必须重新定义
head
,下次我们想在其他类型上使用它。然而,在
one
定义的上下文中,
head
实际上具有类型
[Int]->Int
,因为其类型中的变量被实例化。但这不会改变头的全局定义或类型


(实际上,编译器可以专门化它知道只在少数情况下调用的函数,并根据传入的特定类型调整代码,只要它不改变程序语义。)

这取决于函数
f1
是通过声明还是其他方式绑定的(例如,作为
f2
)的函数参数。在前一种情况下,其类型可以概括为多态,在后一种情况下则不能,未解析部分由上下文确定。即使在前一种情况下,也可以应用其他规则,如ML的值限制

考虑Haskell中的这个例子:

f1=\x->x--多态:f1::a->a
f2=f1 True——实例化f1::Bool->Bool
f2=让f1=\x->f1中的x为真——同样
f2=(\f1->f1 True)(\x->x)--在这里,f1不能是多态的,
--因此,lambda被调用限制为Bool->Bool
同样,在SML中:

val f1=fn x=>x(*多态,f1:'a->'a*)
val f2=f1真
val f2=让val f1=fn x=>x在f1真端(*同样*)
val f2=(fn f1=>f1真)(fn x=>x)(*f1单态,f1:bool->bool*)
val f1=let=0在fn x=>x end(*值限制适用,f1不能是多态的*)
val f2=f1 true(*确定类型f1:bool->bool*)

为清楚起见,我在这里没有使用缩写函数声明语法。

这不太正确,请参阅我的回答。这不是与Cardelli关于类型检查的论文中提到的类似的想法吗?例如
f=let g a=a in(g1,gtrue)
vs
let f g=(g1,gtrue)
?第二个概念中的
g
类型无法正确推断,因为你不能同时统一
Int
Bool
,但第一个概念可以是因为
g
的类型只取决于
g
的主体中的内容@Wes,是的,Cardelli用这个例子解释了为什么函数是ar在类似ML的类型系统中,guments总是被视为单态的(即,可以使用简单的统一来进行类型推断)。
aList :: [Int]
aList = [1,2,3]

one = head aList