【发布时间】:2017-05-13 06:37:57
【问题描述】:
注意:这个问题和我的previous one有点关系,但其实是从不同的角度触及到的问题
考虑以下sn-p:
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)
为什么字符串运算符不能以这种通用方式工作?还是我做错了什么?
【问题讨论】:
-
let inline strOp a = string a -
这是实现更高种类多态性的著名技巧吗?如果我的问题与此有关,为什么 ToString 示例有效?我不明白其中的区别。
-
因为
toStr是一个真正的泛型函数,而strOp实例化一个具有静态解析类型约束的内联函数,但它本身不是内联的,因此不会继承泛型。这可能有助于解释细节:stackoverflow.com/questions/30445828/…
标签: generics f# type-inference