所以我有这个功能:
fn (f,g,x) => g(f(x));
此功能的类型是:
('a -> 'b) * ('b -> 'c) * 'a -> 'c
函数是否意味着f代表'a,g代表'b,x代表'c?同样在那种情况下,('a -> 'b)
是如何产生的?因为这不意味着f - >克?
如果这是一个模糊不清且写得不好的问题,请道歉。
有人可以向我解释如何计算该函数的类型吗?
谢谢。
答案 0 :(得分:5)
这是一个可能有用的图表:
('a -> b') * ('b -> 'c) * 'a -> 'c
^^^^^^^^ ^^^^^^^^ ^ ^^^^^^^
fn ( f , g , x) => g(f(x));
对于您想要的任何类型'a
,'b
和'c
,
f
需要'a
并返回'b
g
需要'b
并返回'c
x
是'a
。最后的'c
说,鉴于这些事情,我们的函数会返回'c
。
那你怎么得到一个'c
?好吧,由于x
是'a
,您可以使用f
来获取'b
:
x : 'a
f(x) : 'b
现在我们有一个'b
,如果你给g
一个'b
它会给你一个'c
:
g(f(x)) : 'c
这就是我们到达函数体的方式。
答案 1 :(得分:1)
将(x1, x2, x3)
映射到e
的函数类型为τ₁ * τ₂ * τ₃ -> τ'
,其中τ₁
是x1
的类型,τ₂
是类型x2
,τ₃
是x3
的类型,τ'
是e
的类型。这是产品类型的定义:它是这些类型的元素元组的类型。
此处f
的格式为'a -> 'b
,g
的格式为'b -> 'c
,x
的格式为'a
{1}}。很明显,f
和g
具有函数类型,因为它们已应用于参数。此外,由于f
已应用于x
,因此f
的参数类型与x
的类型相同:均为'a
。同样,返回类型f
和参数类型g
属于同一类型('b
),因为g
应用于f
返回的值
我不知道你的意思是“代表”。 'c
代表x
的类型(也是g
的参数的类型)。 (这可以是任何类型:函数是多态的。)'b
代表g
的参数类型(它也是f
的返回值的类型)。 'a
代表f
的参数类型。
答案 2 :(得分:1)
由于其他答案已经充分解释了如何派生此函数的类型,我只想补充一点,如果x
参数是咖喱而且f
和g
的组合翻转,该函数将等同于已构建到标准ML中的合成运算符:
fn (f, g) => (fn x => f (g x))
相当于fn (f, g) => (fn x => (f o g) x))
相当于fn (f, g) => f o g
相当于fn (f, g) => (op o) (f, g)
相当于op o
。