2010-07-29 57 views
10

爲什麼此代碼無法工作?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>>' 

回答

7

更改您的代碼

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

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

訣竅在於a的類型。您需要明確允許外部seq保留seq <'a > seq <'a >的子類型的實例。使用#符號可以實現這一點。

4

的錯誤消息描述的問題 - 在F#,list<list<'a>>是不兼容seq<seq<'a>>

upcast功能可以幫助解決這個問題,通過使alist<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 
+0

爲什麼這樣呢?如果你寫「let func(a:seq <'a seq>)= 5」。那麼它可以在沒有任何注入的情況下運行 – 2010-07-29 10:31:29

+0

我得到了同樣的錯誤 - http://gist.github.com/497844 – 2010-07-29 11:00:44

+0

我的錯誤。你是對的。你有什麼解釋爲什麼'讓func(a:float seq)= 5'。我們不必做上傳和seq seq我們必須這樣做? – 2010-07-29 11:14:04