了解 SML 类型 fn (f,g,x) => g(f(x)) 或类似

Understanding an SML type fn (f,g,x) => g(f(x)) or similar

好的,提前抱歉,这可能是重新发布,但我花了 30 分钟搜索 Whosebug,但找不到足够相似的东西来理解。基本上,我不明白为什么

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

给出类型

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

据我了解应该以

开头
'a * 'b * 'c...

但这显然是错误的。

提前致谢。

的确,这一切都以 'a * 'b * 'c 开头,其中 f : 'ag : 'bx : 'c 但随后类型推断机制发现应用了 f x, 所以 所以它得出的结论是函数f : 'd -> 'e(即'b = 'd -> 'e)。此外,x 的类型必须符合 f 的输入类型,因此 'd = 'cf : 'c -> 'e.

此外,g也是一个函数,所以'b = 'y -> 'z很容易看出f的输出类型必须等于g的输入类型,它为我们提供了以下类型方程 'y = 'e.

我们有 x : 'cf : 'c -> 'eg : 'e -> 'z。具体的变量名并不重要,我们可以像这样重命名它们:

'c -> 'a
'e -> 'b
'z -> 'c

x : 'af : 'a -> 'bg : 'b -> 'c

由于 fn (f,g,x) 以三元组作为输入,它的类型必须是

<type of f> * <type of g> * <type of x> -> <output type of g>

展开上面的半正式描述我们得到

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