类型推断:函数和类型

时间:2012-05-14 17:52:46

标签: f#

我正在学习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

但是,如果我尝试使用类型相同的东西,它就不起作用:

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

所以,我有几个问题:

  • 为什么我可以为不同类型而不是类型定义重用泛型函数定义?
  • 该函数是否适用于运行时的每种类型,如同C#泛型一样?或者在编译时像C ++模板一样?或者是拳击表演以将每个参数视为IComparable?

感谢。

1 个答案:

答案 0 :(得分:6)

类需要显式类型参数。这有效:

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)

要回答您的第二个问题,您对min的定义具有签名'a -> 'a -> 'a (requires comparison)comparison约束仅在编译时存在(运行时签名相同,减去约束)。

<被调用GenericLessThanIntrinsic替换,该{{1}}具有约束。约束仅传播给调用者。

另外,根据规范第14.6.7节:

  

泛化是在可能的情况下推断定义的泛型类型的过程,从而使构造可以使用多种不同类型重用。 默认情况下会在所有功能,值和成员定义中应用泛化,除非本节稍后列出。泛化也适用于在对象表达式中实现通用虚方法的成员定义。

(强调补充)

请注意,列表中缺少类。我认为它没有给出理由,但它的设计。