6

此代码将生成以下警告

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# 告诉我我问了一个 double 但它将是一个 int。

当我尝试用这个替换55.告诉我它仍然受到浮点类型的限制。

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

4

1 回答 1

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}
于 2012-10-22T21:20:02.310 回答