了解 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 : 'a
、g : 'b
、x : 'c
但随后类型推断机制发现应用了 f
x
, 所以
所以它得出的结论是函数f : 'd -> 'e
(即'b = 'd -> 'e
)。此外,x
的类型必须符合 f
的输入类型,因此 'd = 'c
和 f : 'c -> 'e
.
此外,g
也是一个函数,所以'b = 'y -> 'z
很容易看出f
的输出类型必须等于g
的输入类型,它为我们提供了以下类型方程 'y = 'e
.
我们有 x : 'c
、f : 'c -> 'e
、g : 'e -> 'z
。具体的变量名并不重要,我们可以像这样重命名它们:
'c -> 'a
'e -> 'b
'z -> 'c
即 x : 'a
、f : 'a -> 'b
和 g : '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
好的,提前抱歉,这可能是重新发布,但我花了 30 分钟搜索 Whosebug,但找不到足够相似的东西来理解。基本上,我不明白为什么
fn (f,g,x) => g(f(x))
给出类型
(’a -> ’b)*(’b -> ’c)*’a -> ’c
据我了解应该以
开头'a * 'b * 'c...
但这显然是错误的。
提前致谢。
的确,这一切都以 'a * 'b * 'c
开头,其中 f : 'a
、g : 'b
、x : 'c
但随后类型推断机制发现应用了 f
x
, 所以
所以它得出的结论是函数f : 'd -> 'e
(即'b = 'd -> 'e
)。此外,x
的类型必须符合 f
的输入类型,因此 'd = 'c
和 f : 'c -> 'e
.
此外,g
也是一个函数,所以'b = 'y -> 'z
很容易看出f
的输出类型必须等于g
的输入类型,它为我们提供了以下类型方程 'y = 'e
.
我们有 x : 'c
、f : 'c -> 'e
、g : 'e -> 'z
。具体的变量名并不重要,我们可以像这样重命名它们:
'c -> 'a
'e -> 'b
'z -> 'c
即 x : 'a
、f : 'a -> 'b
和 g : '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