解释SML函数及其类型

时间:2015-12-13 18:33:57

标签: function types sml

所以我有这个功能:

fn (f,g,x) => g(f(x));

此功能的类型是:

('a -> 'b) * ('b -> 'c) * 'a -> 'c

函数是否意味着f代表'a,g代表'b,x代表'c?同样在那种情况下,('a -> 'b)是如何产生的?因为这不意味着f - >克?

如果这是一个模糊不清且写得不好的问题,请道歉。

有人可以向我解释如何计算该函数的类型吗?

谢谢。

3 个答案:

答案 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 -> 'bg的格式为'b -> 'cx的格式为'a {1}}。很明显,fg具有函数类型,因为它们已应用于参数。此外,由于f已应用于x,因此f的参数类型与x的类型相同:均为'a。同样,返回类型f和参数类型g属于同一类型('b),因为g应用于f返回的值

我不知道你的意思是“代表”。 'c代表x的类型(也是g的参数的类型)。 (这可以是任何类型:函数是多态的。)'b代表g的参数类型(它也是f的返回值的类型)。 'a代表f的参数类型。

答案 2 :(得分:1)

由于其他答案已经充分解释了如何派生此函数的类型,我只想补充一点,如果x参数是咖喱而且fg的组合翻转,该函数将等同于已构建到标准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