【发布时间】: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。所以我可能只是用错误的名字来称呼它(如果你知道这种类型的应用程序叫什么,请分享)。