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

Blu*_*rin 6 f# types

此代码将生成以下警告

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}
Run Code Online (Sandbox Code Playgroud)

警告:

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

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

当我尝试更换时5,5.告诉我它仍然受浮动类型的限制.

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

Dan*_*iel 12

之前删除撇号double.

let t : TimedValue<double> = { ts = DateTime.Today; value=5.0}
Run Code Online (Sandbox Code Playgroud)

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

let t : TimedValue<_> = { ts = DateTime.Today; value=5.0}
Run Code Online (Sandbox Code Playgroud)

或完全删除类型注释:

let t = { ts = DateTime.Today; value=5.0}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,F# 中“double”的正确名称实际上是“float”。 (2认同)