Seq seq类型作为F#中的成员参数

时间:2010-07-29 10:24:11

标签: f# sequences static-members

为什么这段代码不起作用?

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>>'

2 个答案:

答案 0 :(得分:9)

将您的代码更改为

type Test() = 
  static member func (a: seq<#seq<'a>>) = 5. 

let a = [[4.]] 
Test.func(a) 

诀窍在于a的类型。您需要明确允许外部seq保存seq&lt;'a&gt;的实例。 seq&lt;'a&gt;的子类型。使用#符号启用此功能。

答案 1 :(得分:6)

错误消息描述了问题 - 在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