2015-11-26 26 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>或一些其他等效结构类型。