我需要一些帮助来理解类型推断如何影响以下代码,该代码来自上一个问题(经过一番思考后,我将其简化为以下代码):
type 'a result =
| Succ of 'a
| Fail
let first f = function
| Succ c -> let res = f c in Succ res
| fail -> fail
let second f = function
| Succ c -> let res = f c in Succ res
| Fail -> Fail
我的问题是:为什么f
in first
has type('a -> 'a)
而f
in second
has type ('a -> 'b)
?
你可以在这里看到它。
Fail
inFail -> Fail
in的两次出现second
被视为两个不同的值,因此允许有不同的类型'a result
和'b result
,但是fail
infail -> fail
infirst
被视为相同的值,因此不能更改类型。或者至少类型推断系统不允许它更改类型。我不确定这是否是这个特定解释器的规范或怪癖。
作为发人深省的第三个版本:
你和我都知道,如果我们达到
_
模式匹配的情况,这意味着 thatr
是Fail
并且可以是任何'b result
类型,但编译器看到的是 thatr
是类型'a result
,因为它是输入,所以'a == 'b
。