gpt4 book ai didi

Haskell - 类型类的实例列表

转载 作者:行者123 更新时间:2023-12-04 02:05:37 24 4
gpt4 key购买 nike

我对 Haskell 还很陌生,为了变得更好,我正在尝试制作一个简单的 Web 服务器。我想让我表示页面的方式可扩展,所以我的想法是让网页成为可渲染数据的列表(比如如何制作在 Java 中实现某个接口(interface)的对象列表),其中 Renderable 是

class Renderable a where
render :: a -> IO String

不幸的是,我了解到列表必须是具体类型,因此我只能列出一种可渲染数据类型。此外,创建受类型类约束的数据似乎是不可能的,所以我不能制作像 RenderList 数据这样的东西。我的临时解决方案是这样的:
myPage =
[render $ someData
,render $ someMoreData
,render $ someOtherData
...
]

但这感觉很尴尬,使使用类型类没有任何好处,并且感觉应该有更好的方法。所以我想知道有什么方法可以重组我必须更清洁、更符合标准 Haskell 实践并且仍然易于扩展的东西?

谢谢。

最佳答案

您正在尝试实现面向对象的设计风格。例如,在 Java 中,您将有一个 List<Renderable>你就准备好了。这种设计风格在 Haskell 中有点不自然;您需要为有界存在创建包装器类型,如 existential types 的 Haskell wiki 页面所示。 .例如:

class Renderable_ a where
render :: a -> IO String

data Renderable = forall a. Renderable_ a => Renderable a
instance Renderable_ Renderable where
render (Renderable a) = render a

然后,您可以获得 Renderable 的列表,您可以随心所欲地渲染。不过,就像我说的那样,这是一种在 Haskell 中不太自然的 OO 风格。您可以通过重新考虑数据结构来避免这种情况。您说您“想要使您表示页面的方式可扩展”;考虑其他方法来代替。

无关:我猜 render不需要生成 IO String行动。尽量保持 IO如果可以的话,超出你设计的核心。

关于Haskell - 类型类的实例列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12774056/

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