解释 SML 函数及其类型
Explaining an SML function and its type
所以我有这个功能:
fn (f,g,x) => g(f(x));
这个函数的类型是:
('a -> 'b) * ('b -> 'c) * 'a -> 'c
这个函数是不是表示f代表'a,g代表'b,x代表'c?同样在那种情况下, ('a -> 'b)
是如何产生的?因为那不意味着 f -> g 吗?
如果这是一个晦涩难懂且写得不好的问题,我们深表歉意。
有人可以向我解释一下该函数的类型是如何计算的吗?
谢谢。
将 (x1, x2, x3)
映射到 e
的函数类型是 τ₁ * τ₂ * τ₃ -> τ'
其中 τ₁
是 x1
、τ₂
的类型是x2
的类型,τ₃
是x3
的类型,τ'
是e
的类型。这就是产品类型的定义:它是这些类型的元素元组的类型。
此处 f
的类型为 'a -> 'b
,g
的类型为 'b -> 'c
,x
的类型为表格 'a
。很明显 f
和 g
具有函数类型,因为它们应用于参数。此外,由于 f
应用于 x
,因此 f
的参数类型与 x
的类型相同:均为 'a
。同样,f
的 return 类型和 g
的参数类型是同一类型 ('b
),因为 g
应用于值 return编辑者 f
.
我不知道你所说的“代表”是什么意思。 'c
代表 x
的类型(也是 g
的参数类型)。 (这可以是任何类型:该函数是多态的。) 'b
代表 g
的参数类型(这也是 [=21= 的 return 值的类型]). 'a
代表f
的参数类型。
这是一张可能有帮助的图表:
('a -> b') * ('b -> 'c) * 'a -> 'c
^^^^^^^^ ^^^^^^^^ ^ ^^^^^^^
fn ( f , g , x) => g(f(x));
对于您想要的任何类型 'a
、'b
和 'c
、
f
需要一个 'a
和 returns 一个 'b
g
需要一个 'b
和 returns 一个 'c
x
是一个 'a
.
最后的 'c
表示,鉴于这些,我们的函数 returns a 'c
.
那么如何获得 'c
?好吧,因为 x
是一个 'a
,你可以使用 f
得到一个 'b
:
x : 'a
f(x) : 'b
现在我们有一个 'b
,如果你给 g
一个 'b
它会还给你一个 'c
:
g(f(x)) : 'c
这就是我们到达函数主体的方式。
由于其他答案已经充分解释了如何推导此函数的类型,我将补充一点,如果 x
参数被柯里化并且 f
和 [=12 的组合=] 翻转后,该函数将等同于标准 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
.
所以我有这个功能:
fn (f,g,x) => g(f(x));
这个函数的类型是:
('a -> 'b) * ('b -> 'c) * 'a -> 'c
这个函数是不是表示f代表'a,g代表'b,x代表'c?同样在那种情况下, ('a -> 'b)
是如何产生的?因为那不意味着 f -> g 吗?
如果这是一个晦涩难懂且写得不好的问题,我们深表歉意。
有人可以向我解释一下该函数的类型是如何计算的吗?
谢谢。
将 (x1, x2, x3)
映射到 e
的函数类型是 τ₁ * τ₂ * τ₃ -> τ'
其中 τ₁
是 x1
、τ₂
的类型是x2
的类型,τ₃
是x3
的类型,τ'
是e
的类型。这就是产品类型的定义:它是这些类型的元素元组的类型。
此处 f
的类型为 'a -> 'b
,g
的类型为 'b -> 'c
,x
的类型为表格 'a
。很明显 f
和 g
具有函数类型,因为它们应用于参数。此外,由于 f
应用于 x
,因此 f
的参数类型与 x
的类型相同:均为 'a
。同样,f
的 return 类型和 g
的参数类型是同一类型 ('b
),因为 g
应用于值 return编辑者 f
.
我不知道你所说的“代表”是什么意思。 'c
代表 x
的类型(也是 g
的参数类型)。 (这可以是任何类型:该函数是多态的。) 'b
代表 g
的参数类型(这也是 [=21= 的 return 值的类型]). 'a
代表f
的参数类型。
这是一张可能有帮助的图表:
('a -> b') * ('b -> 'c) * 'a -> 'c
^^^^^^^^ ^^^^^^^^ ^ ^^^^^^^
fn ( f , g , x) => g(f(x));
对于您想要的任何类型 'a
、'b
和 'c
、
f
需要一个'a
和 returns 一个'b
g
需要一个'b
和 returns 一个'c
x
是一个'a
.
最后的 'c
表示,鉴于这些,我们的函数 returns a 'c
.
那么如何获得 'c
?好吧,因为 x
是一个 'a
,你可以使用 f
得到一个 'b
:
x : 'a
f(x) : 'b
现在我们有一个 'b
,如果你给 g
一个 'b
它会还给你一个 'c
:
g(f(x)) : 'c
这就是我们到达函数主体的方式。
由于其他答案已经充分解释了如何推导此函数的类型,我将补充一点,如果 x
参数被柯里化并且 f
和 [=12 的组合=] 翻转后,该函数将等同于标准 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
.