解释 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 -> 'bg 的类型为 'b -> 'cx 的类型为表格 'a。很明显 fg 具有函数类型,因为它们应用于参数。此外,由于 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.