首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协变序列

协变序列
EN

Stack Overflow用户
提问于 2015-11-26 12:43:20
回答 1查看 139关注 0票数 2

我想创建一个F# seq,并确保每个元素都是某个任意类型SelctionDescriptor<'a>的记录类型'a。我知道如何实现这种OOP风格:在抽象类上定义seq,然后从它继承泛型类。但是如何实现这种函数式风格呢?

我想要一个协变的seq,其中每个元素可能是不同的类型。

EN

回答 1

Stack Overflow用户

发布于 2015-11-28 07:28:36

正如您目前描述的问题,除非'a是常规类型,否则我看不到任何范式的类型安全解决方案可供您使用。正如您在问题中指出的,您可以使用非泛型接口或抽象基类,但这种方法可能会在某些时候将您引向类型测试和不安全类型转换的路线-这绝对不是一个有利的选择。

如果您可以重构您的描述符,那么其他选项可能会变得可用。为了在一个集合中支持各种不同的东西,与C#相比,F#实际上开放了一些选项,前提是您可以提前指定使用区分联合的可能选项。

考虑到你有一个选择描述符的序列,它可能是一个浮点型或整型,你可以创建:

代码语言:javascript
复制
type SelectionDescriptor =
    |SelectionDescriptorInt of int
    |SelectionDescriptorFloat of float

下面是一个列表示例:

代码语言:javascript
复制
let test = 
    [SelectionDescriptorInt 3; SelectionDescriptorFloat 7.0; 
     SelectionDescriptorFloat 19.7; SelectionDescriptorInt 0 ]

然后,当您检查结果时,您可以对每个元素执行模式匹配。这不会影响解决方案的类型安全性,如果我们的检查不是详尽的,编译器会警告我们。

注释:如果不同项的结构是规则的,那么使用这种方法是非常不理想的,例如,如果你有int,float,int float等,你最好使用seq<int*float>或其他等效的结构化类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33930750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档