gpt4 book ai didi

haskell - 如何将我在 OOP 中的想法转换为 Haskell?

转载 作者:行者123 更新时间:2023-12-01 07:04:28 25 4
gpt4 key购买 nike

例如,我有一个容器类型来保存具有共同特征的元素。而且我还提供了一些类型作为元素。而且我还希望这个功能可以轻松扩展(其他人可以制作自己的元素类型并由我的容器保存)。

所以我这样做:

class ElementClass
data E1 = E1 String
instance ElementClass E1
data E2 = E2 Int
instance ElementClass E2
data Element = forall e. (ElementClass e) => Element e
data Container = Container [Element]

这很好,直到我需要单独处理元素。由于forall,函数“f::Element -> IO()”无法知道它究竟是什么元素。

以 Haskell 风格执行此操作的正确方法是什么?

最佳答案

to know what element it is exactly



要知道这一点,您当然应该使用简单的 ADT
data Element' = E1Element E1
| E2Element E2
| ...

这样,您可以对容器中的哪一个进行模式匹配。

现在,这与

others could make their own element type and be hold by my container



它必须发生冲突!当允许其他人向元素列表中添加新类型时,没有办法安全地匹配所有可能的情况。因此,如果您想匹配,唯一正确的做法是拥有一组封闭的可能性,就像 ADT 给您的那样。

OTOH,就像您最初想到的那样,允许类型的类是开放的。没关系,但这只是因为实际上无法访问确切的类型,而只能访问 forall e. ElementClass e 定义的公共(public)接口(interface)。 .

存在主义在 Haskell 中确实有点不受欢迎,因为它们太面向对象了。但有时这是正确的做法,您的应用程序可能是一个很好的案例。

关于haskell - 如何将我在 OOP 中的想法转换为 Haskell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25030233/

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