我正在学习F#,我不明白类型推断和泛型如何在这种语言中工作.例如,我可以声明一个通用的min函数,并将它与不同类型的参数一起使用:
let min a b = if a < b then a else b
let smallestInt = min 3 5
let smallestFloat = min 3.0 5.0
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用类型相同的东西,它不起作用:
type Point2D(x, y) =
member this.X = x
member this.Y = y
let float32Point = new Point2D(0.0f, 1.0f)
let intPoint = new Point2D(0, 1) // This expression was expected to have type
// float32 but here has type int
Run Code Online (Sandbox Code Playgroud)
所以,我有几个问题:
谢谢.
类需要显式类型参数.这有效:
type Point2D<'T>(x:'T, y:'T) =
member this.X = x
member this.Y = y
let float32Point = Point2D(0.0f, 1.0f)
let intPoint = Point2D(0, 1)
Run Code Online (Sandbox Code Playgroud)
要回答你的第二个问题,你的定义min有签名'a -> 'a -> 'a (requires comparison).该comparison限制只在编译时(运行时的签名相同,减去约束)的存在.
<被替换为GenericLessThanIntrinsic具有约束的调用.约束仅传播给呼叫者.
另外,从规范的第14.6.7节:
泛化是在可能的情况下推断定义的泛型类型的过程,从而使构造可以使用多种不同类型重用.默认情况下,在所有函数,值和成员定义中应用泛化,除非本节稍后列出.泛化也适用于在对象表达式中实现通用虚方法的成员定义.
(重点补充)
请注意,列表中缺少类.我认为它没有给出理由,但它是设计的.
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |