爲什麼此代碼無法工作?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>>'
爲什麼此代碼無法工作?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>>'
更改您的代碼
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a)
訣竅在於a的類型。您需要明確允許外部seq保留seq <'a > 和 seq <'a >的子類型的實例。使用#符號可以實現這一點。
的錯誤消息描述的問題 - 在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
爲什麼這樣呢?如果你寫「let func(a:seq <'a seq>)= 5」。那麼它可以在沒有任何注入的情況下運行 – 2010-07-29 10:31:29
我得到了同樣的錯誤 - http://gist.github.com/497844 – 2010-07-29 11:00:44
我的錯誤。你是對的。你有什麼解釋爲什麼'讓func(a:float seq)= 5'。我們不必做上傳和seq seq我們必須這樣做? – 2010-07-29 11:14:04