gpt4 book ai didi

f# - 当类型聚合其他类型时如何避免样板代码

转载 作者:行者123 更新时间:2023-12-01 22:31:45 25 4
gpt4 key购买 nike

我想为我的领域建模。我从聚合开始:

type Tree() =
member x.Plant = ...
member x.Trim = ...
member x.Uproot = ...

type FruitTree(tree : Tree) =
member x.Trim = ... // redefine
member x.PickFruit = ...
// and also make available members from Tree type without following boilerplate code to forward calls
member x.Plant = tree.Plant
member x.Uproot = tree.Uproot

如何使聚合对象中的成员可用而无需拼写出来?

编辑

继承时,继承类型的成员在新创建类型的公共(public)表面。有没有一种方法可以在不暴露实际字段的情况下使用聚合类型的容器获得类似的效果?

最佳答案

有几种方法可以做到这一点,这实际上取决于您实际在做什么 - 树木和果树的示例永远不会足够现实。看看Scott Wlaschin's Domain Driven Design Material ,这是对选项的一个很好的总结。

在 F# 中,人们通常避免继承而使用组合。您可以编写一个如下所示的包装器:

type FruitTree(tree : Tree) =
member x.Tree = tree // Expose the wrapped tree
member x.PickFruit = // Add other functionality here

这在某些情况下可能有效。如果您正在寻找功能更强大的解决方案,则应该将数据与操作分开。然后你可以定义看起来像这样的数据结构:

type Tree = 
| Ordinary of int // Some data about tree - say, number of branches
| Fruit of Tree * int // Annotates another tree with number of fruits

然后你可以编写对树进行操作的函数:

let rec trim tree =
match tree with
| Ordinary(n) -> Ordinary(n-1) // Remove one branch from the tree
| Fruit(t, f) -> Fruit(trim t, f) // Recursively apply on the wrapped tree

也就是说,您确实需要给出一个更具体的示例才能获得有用的答案..

关于f# - 当类型聚合其他类型时如何避免样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29240575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com