[英]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.