【问题标题】:F#'s auto generalization didnt work as expectedF# 的自动泛化没有按预期工作
【发布时间】:2020-12-15 01:02:42
【问题描述】:

考虑以下 f# 代码

let vl x= let tem y =(x,y) in tem in let a= vl 5 in Console.WriteLine((a "4",a 3))

其中 vl 具有签名 'a -> 'b -> 'a * 'b 所以 tem 是 'b -> 'a * 'b 但是编译代码会产生错误消息:

错误 FS0001 此表达式应具有类型 '字符串'
但这里有类型 'int'

这是怎么回事?

【问题讨论】:

    标签: f# type-inference


    【解决方案1】:

    这是因为永远令人恐惧和令人困惑的值限制

    vl 的签名确实如您所愿。不能通用的是a的签名。

    它不能是泛型的,因为它在语法上是一个值,而不是一个函数,这是值限制的本质。有关它的更多信息,请参阅this answer

    如果a 是顶级绑定,则可以通过显式为其提供一个通用参数(如let a<'t> = ...)来解决此问题,但由于它是本地绑定,因此这是行不通的,并且是解决此问题的唯一方法就是给它一个参数,所以它不再是一个值,而是一个函数:

    let vl x = let tem y = (x,y) in tem in let a z = vl 5 z in (a "4", a 3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2020-03-18
      • 2012-06-14
      • 2014-11-15
      • 1970-01-01
      相关资源
      最近更新 更多