gpt4 book ai didi

generics - ToString() 与字符串运算符的类型推断

转载 作者:行者123 更新时间:2023-12-01 12:24:32 25 4
gpt4 key购买 nike

注意:这个问题和我的previous one有点关系, 但它实际上从不同的角度触及了这个问题

考虑以下代码段:

let toStr a = a.ToString()
let strOp a = string a

let intToStr = 5 |> toStr
let floatToStr = 5.0 |> toStr

let intStrOp = 5 |> strOp
let floatStrOp = 5.0 |> strOp //type inference error

虽然 strOp 函数使用了看起来更优雅的解决方案,并且也能够将单位值转换为字符串,但它似乎并不是真正的通用,因为它的类型在它的第一次使用(甚至推断的类型是 obj -> string,而不是 'a -> string)

为什么字符串运算符不能以这种通用方式工作?还是我做错了什么?

最佳答案

区别在于string使用静态成员约束(参见 the definition ),而 ToString是可用于任何对象的普通方法,因此编译器将 ToString 视为作为不以任何方式限制实例类型的通用代码的调用。

静态约束和(非静态)泛型在(否则不受约束)中使用时以不同的方式工作 let -绑定(bind)函数:

  • 对于通用代码,编译器传播通用性并生成 let - 你也写了通用的绑定(bind)函数。

  • 对于静态成员约束,编译器根据首次使用对代码进行专门化处理。如评论中所述,您可以使用 inline 来避免这种情况。 ,它允许基于静态成员的泛型以与普通泛型代码相同的方式传播。

我认为 string 的唯一原因函数使用静态解析的类型约束是因为它允许它像普通的一样专门化 ToString调用基本类型,但仍处理 null对象的自定义方式的值 - toStr null抛出异常但是 strOp null返回空字符串!

关于generics - ToString() 与字符串运算符的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com