Seq seq类型作为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>>'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
将代码更改为
技巧在于 a 的类型。您需要明确允许外部 seq 保存 seq<'a> 的实例。 seq<'a> 的和子类型。使用 # 符号可以实现此目的。
Change your code to
The trick is in the type of a. You need to explicitly allow the outer seq to hold instances of seq<'a> and subtypes of seq<'a>. Using the # symbol enables this.
错误消息描述了问题 - 在 F# 中,
list
与>
seq>
不兼容。upcast
函数通过将a
转换为list>
来帮助解决这个问题,然后与兼容>seq>
:编辑: 您可以使
func
在其接受的类型方面更加灵活。原始版本仅接受seq<'a>
序列。尽管list<'a>
实现了seq<'a>
,但类型并不相同,编译器会给出错误。但是,您可以修改
func
以接受任何类型的序列,只要该类型实现seq<'a>
,只需将内部类型编写为#seq :
The error message describes the problem -- in F#,
list<list<'a>>
isn't compatible withseq<seq<'a>>
.The
upcast
function helps get around this, by makinga
into alist<seq<float>>
, which is then compatible withseq<seq<float>>
:Edit: You can make
func
more flexible in the types it accepts. The original accepts only sequences ofseq<'a>
. Even thoughlist<'a>
implementsseq<'a>
, the types aren't identical, and the compiler gives you an error.However, you can modify
func
to accept sequences of any type, as long as that type implementsseq<'a>
, by writing the inner type as#seq
: