此代码将生成以下警告
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#处理类型?
答案 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}