我想创建一个F# seq,并确保每个元素都是某个任意类型SelctionDescriptor<'a>的记录类型'a。我知道如何实现这种OOP风格:在抽象类上定义seq,然后从它继承泛型类。但是如何实现这种函数式风格呢?
我想要一个协变的seq,其中每个元素可能是不同的类型。
发布于 2015-11-28 07:28:36
正如您目前描述的问题,除非'a是常规类型,否则我看不到任何范式的类型安全解决方案可供您使用。正如您在问题中指出的,您可以使用非泛型接口或抽象基类,但这种方法可能会在某些时候将您引向类型测试和不安全类型转换的路线-这绝对不是一个有利的选择。
如果您可以重构您的描述符,那么其他选项可能会变得可用。为了在一个集合中支持各种不同的东西,与C#相比,F#实际上开放了一些选项,前提是您可以提前指定使用区分联合的可能选项。
考虑到你有一个选择描述符的序列,它可能是一个浮点型或整型,你可以创建:
type SelectionDescriptor =
|SelectionDescriptorInt of int
|SelectionDescriptorFloat of float下面是一个列表示例:
let test =
[SelectionDescriptorInt 3; SelectionDescriptorFloat 7.0;
SelectionDescriptorFloat 19.7; SelectionDescriptorInt 0 ]然后,当您检查结果时,您可以对每个元素执行模式匹配。这不会影响解决方案的类型安全性,如果我们的检查不是详尽的,编译器会警告我们。
注释:如果不同项的结构是规则的,那么使用这种方法是非常不理想的,例如,如果你有int,float,int float等,你最好使用seq<int*float>或其他等效的结构化类型。
https://stackoverflow.com/questions/33930750
复制相似问题