[英]Seq seq type as a member parameter in F#
为什么这段代码不起作用?
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亚型<”一个>。 使用#符号启用此功能。
错误消息描述了问题 - 在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
实现seq<'a>
:
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a) // works
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.