我最近遇到了来自F#编译器的一些意想不到的行为。我能找到解决方法,但原来的行为让我感到困惑,我想看看是否有人能帮我理解是什么原因造成的。为什么F#编译器有时会错误地泛化函数?
我定义为非泛型的函数正在变得泛型,它干扰了函数在多个调用之间共享状态的能力。我简化我的用例下降到以下几点:
let nextId =
let mutable i = 0
let help (key:obj) =
i <- i + 1
i
help
nextId "a" // returns 1
nextId "b" // also returns 1!!!!
为什么nextId型“A - > INT而不是OBJ - >诠释?很明显泛化也是导致它重复返回1的错误的原因,但为什么泛化发生在第一位呢?
需要注意的是,如果我把它定义不点名的嵌套函数,它按预期工作中给予的唯一ID:
let nextId =
let mutable i = 0
fun (key:obj) ->
i <- i + 1
i
nextId "a" // returns 1
nextId "b" // returns 2
但更神秘的,这个定义,F#互动不能决定nextId是否一个(obj - > int)或一个('a - > int)。当我第一次把它定义我得到
VAL nextId:(OBJ - > INT)
,但如果我只是EVAL
nextId
我得到
VAL是:(” a - > int)
这是怎么回事,为什么我的简单函数会自动地泛化美化版?