2015-11-26 53 views
2

我想創建一個F#seq並確保每個元素對於某些任意類型'a的記錄類型SelctionDescriptor<'a>。我知道如何做這種OOP風格:在抽象類上定義seq,然後從中繼承泛型類。但如何做到這一功能的風格?協變序列

我想要一個協變seq其中每個元素可能是不同的類型。

+1

'seq '?不需要繼承 –

+1

你不會在C#中使用繼承......'IEnnumerable >'也可以在那裏工作 – Carsten

+0

你不能在沒有指定類型的情況下創建一個seq。我想要一個seq,其中每個元素可以是不同類型的 – user3905162

回答

0

正如您目前描述的那樣,除非'a屬於常規類型,否則在任何範例中我都沒有看到類型安全的解決方案。正如你在你的問題中提到的那樣,你可以使用非泛型接口或抽象基類,但這種方法可能會導致你在某種程度上導致類型測試和不安全的鑄造路線 - 這絕對不是一個有利的選擇。

如果您可以重構您的描述符,那麼其他選項可能會變得可用。爲了支持集合中的各種不同事物,F#實際上比C#打開了一些選項,前提是您可以提前指定可能的選項使用區分的聯合。

考慮你有選擇的描述符的序列,這可能是一個浮動或int,你可以創建:

type SelectionDescriptor = 
    |SelectionDescriptorInt of int 
    |SelectionDescriptorFloat of float 

一個例子作爲一個列表:

let test = 
    [SelectionDescriptorInt 3; SelectionDescriptorFloat 7.0; 
    SelectionDescriptorFloat 19.7; SelectionDescriptorInt 0 ] 

然後,當你檢查結果你可以在每個元素上執行模式匹配。這不會影響解決方案的類型安全性,如果我們的檢查不是詳盡的,編譯器會警告我們。

注意:這將是非常不理想的使用這種方法,如果不同項目的結構是有規律的,也就是說,如果你有整型,浮點,INT float等你會好得多使用seq<int*float>或一些其他等效結構類型。