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

Old*_*vec 11 f# sequences static-members

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

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

let a = [[4.]]
Test.func(a)
Run Code Online (Sandbox Code Playgroud)

它给出以下错误:

The type 'float list list' is not compatible with the type 'seq<seq<'a>>'
Run Code Online (Sandbox Code Playgroud)

Ale*_*rey 9

将您的代码更改为

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

let a = [[4.]] 
Test.func(a) 
Run Code Online (Sandbox Code Playgroud)

诀窍在于a的类型.您需要明确允许外SEQ持有序列的情况下,<"一个> 序列的亚型<"一个>.使用#符号启用此功能.


Tim*_*son 6

错误消息描述了问题 - 在F#中,list<list<'a>>与之不兼容seq<seq<'a>>.

upcast功能有助于解决这个问题,通过制作a一个list<seq<float>>,然后兼容seq<seq<float>>:

let a = [upcast [4.]]
Test.func(a)
Run Code Online (Sandbox Code Playgroud)

编辑:您可以func在其接受的类型中更灵活.原文只接受序列seq<'a>.即使是list<'a>implements seq<'a>,类型也不相同,编译器会给你一个错误.

但是,您可以修改func为接受任何类型的序列,只要该类型seq<'a>通过将内部类型写为#seq:

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

let a = [[4.]]
Test.func(a) // works
Run Code Online (Sandbox Code Playgroud)