【问题标题】:Haskell - List of instances of a TypeclassHaskell - 类型类的实例列表
【发布时间】:2012-10-08 10:57:44
【问题描述】:

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

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

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

myPage =
    [render $ someData
    ,render $ someMoreData
    ,render $ someOtherData
    ...
    ]

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

谢谢。

【问题讨论】:

  • 为什么不使用已有的 Web 框架? Yesod、Snap、Happstack,都是不错的选择。
  • @KristopherMicinski 我不想这样做,因为我用它作为学习 Haskell 的一种方式。
  • 老实说:Haskell 中的低级 Web 编程很难!执行 IO 的正确方法仍未完全理解,并且以函数式风格对其进行正确编程是一门艺术。这听起来像是对 Haskell 生气而不是学习它的更好方法。我仍然认为您可以学习所有核心功能,同时获得一些“真实”的东西,并且如果您使用预烘焙的 Web 框架,那么挫败感就会大大降低。
  • P.s.,请注意,在您给出的示例中,您可以通过在列表上使用map 轻松清理它。
  • @KristopherMicinski 也许 Web Server 是错误的术语。我是网络开发的新手,所以我不太了解这些术语。本质上,我正在制作的是一个从 cgi 脚本运行的应用程序,该脚本使用我网站的 .htaccess 中的 RewriteRule 运行(这是在我大学的服务器上)。然后我的应用程序创建打印的 html。所以我可能只是用错误的名字来称呼它(如果你知道这种类型的应用程序叫什么,请分享)。

标签: haskell typeclass


【解决方案1】:

您正在尝试实现一种面向对象的设计风格。例如,在 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 排除在设计的核心之外。

【讨论】:

    【解决方案2】:

    在 haskell heterogenous collections 上查看此页面。 它提供了几种方法的想法。

    【讨论】:

    • 感谢您的回复。不幸的是,似乎最接近我想要做的事情 - 4. 存在类型 - 似乎仍然存在我的解决方案遇到的相同问题。我不明白他们如何创建 hlist 比使用 String 和 show 而不是 Showable 和 pack 创建 hlist 更好。
    猜你喜欢
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多