.net - 是否可以从类型/函数定义中重构​​泛型参数约束?

标签 .net f#

假设我有一个泛型类型,其中包含一长串泛型参数约束:

type Gen<'A when cond1 and cond2 and ...>(a:'A) =
    member this.A = a

此外,项目中的其他类型也会出现相同的约束列表。每次重复相同的约束列表会产生很多噪音。更糟糕的是,它妨碍了可扩展性和功能设计,因为作用于 Gen.A 的函数需要重新声明这些约束。对于 Gen 的方法来说情况并非如此。

是否可以从类型定义中重构​​这些约束?这类似于创建类型的类型或类型的谓词。

编辑:具体情况如下,尽管这可能没有帮助。我有三个抽象类 ProductViewerProducer。参数化为

Product<'Viewer> 
Viewer<'Product> 
Producer<'Product, 'Viewer where 'Product:> Product<'Viewer> and 'Viewer:>Viewer<'Product> and 'Viewer : (new : unit -> 'Viewer)>

这是最后一个让我烦恼的。 Viewer 比较 Product 的不同实例,Producer 从数据流中生成 Products 并将它们添加到适当的 Viewers 中。不同类型的产品是通过继承Product来完成的,相应的Viewer则派生于Viewer。

这有点乱,但我相信这是在不牺牲性能或静态类型检查的情况下最干净的方法。例如,如果将 Viewer 的抽象方法从通用 AddProduct: 'Product->unit 更改为从抽象类获取参数:AddProduct: Product,则整个通用结构可能会被丢弃->unit (并对其他方法进行类似的修改)。然而,这将使得人们可以向查看器添加错误类型的产品,并且它只会在运行时抛出。

我相信,创建可以协同工作的通用类型元组的问题是在 NET 中没有真正干净的解决方案。

最佳答案

F# 中没有这样的机制。您可以通过使用静态工厂函数来限制需要了解约束的函数,该静态工厂函数约束可以用来构造类的值,然后将依赖于约束的所有函数作为参数传递。在大量函数确实需要参数约束的情况下,这显然有一些严重的缺点。这里可能还有其他选项,我认为所有这些最终都会成为类中需要类型约束的部分的某种形式的隔离。

关于.net - 是否可以从类型/函数定义中重构​​泛型参数约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23967911/

相关文章:

c# - 如何对 LINQ to Objects 查询进行分区?

.net - 等待!哪个配置文件? ( Entity Framework 连接字符串)

c# - "+"在成员 c# 之后反射(reflect)的全名和 '*' 是什么意思#

.net - FlatLoop/UnFlatLoop 在 valueinjecter 中意味着什么?

wpf - F# 如何以编程方式在 WPF 标签上设置内容

f# - F# 是否支持模板或泛型?

c# - COM 与 WinRT 的关系

f# - 如何保证F#应用程序中的参照透明性?

f# - 嵌套类型提供者

c# - F# 屈服! operator - 实现和可能的 C# 等价物