此构造使代码不如类型注释所指示的那样通用。类型变量'x已被约束为类型y'

时间:2012-10-22 21:16:38

标签: types f#

此代码将生成以下警告

module TimeSeries

open System

type TimedValue<'T> = { ts : DateTime; value: 'T}
type TimeSerie<'T> = TimedValue<'T> seq

let t : TimedValue<'double> = { ts = DateTime.Today; value=5}

警告:

  

此构造导致代码不像类型注释所指示的那样通用。类型变量'double已被约束为类型'int'。

我对F#很新,我认为5被解释为一个int而且不知怎的F#告诉我,我问了一个双重但它会是一个int。

当我尝试用5替换5.时,这告诉我它仍然受浮点类型的限制。

我应该以某种方式将其转换为double或只删除声明部分: TimedValue<'double>并让F#处理类型?

1 个答案:

答案 0 :(得分:12)

double之前删除撇号。

let t : TimedValue<double> = { ts = DateTime.Today; value=5.0}

一个前导撇号用于声明一个类型参数。因此,您已声明了一个通用值,但通过指定value=5,您已将类型arg约束为int。您还可以使用通配符代替arg:

类型
let t : TimedValue<_> = { ts = DateTime.Today; value=5.0}

或完全删除类型注释:

let t = { ts = DateTime.Today; value=5.0}