为什么这段代码不起作用?
type Test() =
static member func (a: seq<'a seq>) = 5.
let a = [[4.]]
Test.func(a)
它给出以下错误:
The type 'float list list' is not compatible with the type 'seq<seq<'a>>'
为什么这段代码不起作用?
type Test() =
static member func (a: seq<'a seq>) = 5.
let a = [[4.]]
Test.func(a)
它给出以下错误:
The type 'float list list' is not compatible with the type 'seq<seq<'a>>'
将您的代码更改为
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a)
诀窍在于a的类型。您需要明确允许外部seq保存seq <'a>的实例 和 seq <'a>的子类型。使用#符号启用此功能。
错误消息描述了问题 - 在F#中, list<list<'a>>
与...不兼容 seq<seq<'a>>
。
该 upcast
通过制作,功能有助于解决这个问题 a
变成一个 list<seq<float>>
,然后兼容 seq<seq<float>>
:
let a = [upcast [4.]]
Test.func(a)
编辑: 你(们)能做到 func
它接受的类型更灵活。原文只接受序列 seq<'a>
。即使 list<'a>
器物 seq<'a>
,类型不相同,编译器给你一个错误。
但是,您可以修改 func
接受任何类型的序列,只要该类型实现 seq<'a>
,将内部类型写为 #seq
:
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a) // works
将您的代码更改为
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a)
诀窍在于a的类型。您需要明确允许外部seq保存seq <'a>的实例 和 seq <'a>的子类型。使用#符号启用此功能。
错误消息描述了问题 - 在F#中, list<list<'a>>
与...不兼容 seq<seq<'a>>
。
该 upcast
通过制作,功能有助于解决这个问题 a
变成一个 list<seq<float>>
,然后兼容 seq<seq<float>>
:
let a = [upcast [4.]]
Test.func(a)
编辑: 你(们)能做到 func
它接受的类型更灵活。原文只接受序列 seq<'a>
。即使 list<'a>
器物 seq<'a>
,类型不相同,编译器给你一个错误。
但是,您可以修改 func
接受任何类型的序列,只要该类型实现 seq<'a>
,将内部类型写为 #seq
:
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a) // works