此OCaml表达式的参数类型为非';t定义为AFAIK,为什么另一个表达式有'_a而不是';A.
我明白了此OCaml表达式的参数类型为非';t定义为AFAIK,为什么另一个表达式有'_a而不是';A.,ocaml,type-inference,Ocaml,Type Inference,我明白了 let apply f x = f x 有类型 ('a -> 'b) -> 'a -> 'b apply是一个函数,它接受函数f和参数x,并返回应用于x的f。因此,如果fx具有类型'b并且x具有类型'a,那么f必须具有类型'a->'b,因此您可以将它们组合起来得到('a->'b>)-'a->'b。我明白了。通过扩展,let identity f=f具有类型'a->'a,因为它接受类型为'a'的项,并返回类型为'a的相同项,所以它的类型为'a->'a。我明白了 le
let apply f x = f x
有类型
('a -> 'b) -> 'a -> 'b
apply
是一个函数,它接受函数f
和参数x
,并返回应用于x
的f
。因此,如果fx
具有类型'b
并且x
具有类型'a
,那么f
必须具有类型'a->'b
,因此您可以将它们组合起来得到('a->'b>)-'a->'b
。我明白了。通过扩展,let identity f=f
具有类型'a->'a
,因为它接受类型为'a'
的项,并返回类型为'a
的相同项,所以它的类型为'a->'a
。我明白了
let bf b f = if (f b) then f else (fun x -> b)
是一种
bool -> (bool -> bool) -> bool -> bool
fb
必须为bool
类型,因此f
为'a->bool
,b
为'a
类型<类型为'a->bool
的code>f与funx->b
的类型相同,即'c->'a
。所以,'c='a=bool
,所以bf
接受bool
,然后是f
的类型,即bool->bool
,并返回bool->bool
,作为最后一种
bool -> (bool -> bool) -> bool -> bool
我必须找到一种
let t1 = apply bf
与应用bf的类型相同
因此,apply f
是'a->'a
如果f
具有类型'a
,那么我希望apply bf
具有类型(bf)->类型(bf)
,这将是
bool -> (bool -> bool) -> bool -> bool -> bool -> (bool -> bool) -> bool -> bool
显然,apply bf
属于bool->(bool->bool)->bool->bool
类型,我不明白为什么会这样
我也不明白'a
类型和'u a
类型之间的区别
如果让应用fx=fx
,则应用
具有类型('a->'b)->'a->'b
,并且让app2=apply应用
具有类型
('_a -> '_b) -> '_a -> '_b
如果有人能帮助我理解为什么会这样,这样我就不会在没有理解的情况下简单地提交答案而感到迷失,那将不胜感激
我希望apply bf具有type(bf)->type(bf)
这是错误的。首先请注意,应用程序的键入规则是
f : A -> B
x : A
-------------
f x : B
在你的例子中,多态性在起作用,但想法是一样的
apply : ('a -> 'b) -> ('a -> 'b)
bf : A -> B
------------------------------------
apply : (A -> B) -> (A -> B)
bf : A -> B
------------------------------------
apply bf : A -> B
我也不明白“a型”和“a型”之间的区别
符号
“\u a
表示虚拟类型,以及“值限制”的结果,该“值限制”表示只有值表达式可以是多态的。参见描述的另一种方式是,它表示任意类型,但仅表示一种特定类型。也就是说,它是一个单态变量。这种机制比简单地拒绝违反值限制的代码更灵活。谢谢。另一个函数呢:让wfx=x(fx)
。我得到fx
有类型B
,x
有类型A
,因此f
有类型A->B
。然而,然后x
也必须是B->C
类型,因为它的右侧是B
,这意味着A
=B->C
,所以f
实际上是B->C->B
类型<代码>w属于((a->b)->a)->(a->b)->b
类型。如果说a
是更大的东西这一事实很奇怪的话,那么这一点应该是一致的。我不知道如何推导。我发现的另一个例子是(a->(b->a))->b->a->b
,但这并不好。然后你有f:a->b
和x:C->D
,因为它们都是函数。由于x
是fx
中f
的输入,因此A=C->D
。既然fx
是x
的输入,那么B=C
。所以我们有f:(C->D)->C
和x:C->D
。所以w:((C->D)->C)->(C->D)->D
。