最近新闻中的两个Haskell web框架是Yesod(0.8)和Snap(0.4)。

很明显,Yesod目前支持的功能比Snap多得多。然而,我无法忍受Yesod使用的HTML、CSS和Javascript语法。

所以,我想知道如果我用Snap会错过什么。例如,似乎没有数据库支持。会话呢?其他功能吗?


提醒一下,我是Yesod的首席开发者。

我不知道你不喜欢Javascript的语法:它是简单的Javascript变量插值。至于CSS Yesod现在有Lucius,它允许你也使用普通的CSS。对于HTML,你可以很容易地使用任何其他你想要的库,包括Heist (Snap使用的)。也就是说,跳过CSS/Javascript语法的Yesod是一件有点有趣的事情,因为Snap甚至没有语法。当然欢迎您使用他们的静态文件解决方案。

Yesod提供了对身份验证/授权、类型安全的url、小部件、电子邮件和一堆小东西(面包屑、消息、最终目的地)的无缝支持。此外,Yesod有一组相当丰富的附加包,用于注释和降价,还有一些大型的现实代码库可供选择作为示例。如果其中任何一条对你有吸引力,你可能要检查一下你的替代方案是否支持它们。


试试《哈姆雷特》吧,你可能会喜欢它的。表面上的负面反应并不少见。然而,没有人真正使用哈姆雷特抱怨。

另外,为什么不用Happstack呢?仅仅因为他们不是“新闻人物”并不意味着他们没有一个坚实的框架。


全面披露:我是Snap的主要开发者之一。

首先,我们来谈谈Snap是什么。现在Snap团队在hackage上维护着五个不同的项目:Snap -core、Snap -server、heist、Snap和xmlhtml。snap-server是一个web服务器,它公开了snap-core定义的API。抢劫是一个模板系统。xmlhtml是heist使用的XML/HTML解析和呈现库。snap是一个伞形项目,它把所有这些都粘合在一起,并提供了强大的snap API,使web应用程序可组合和模块化。

Yesod有很多关于黑客的项目。大多数(全部?)都被列在Yesod类别中。一些值得注意的是yesod-core, warp, persistent和hamlet。

Haskell web开发的现实是,它不是一个排他性的-或选择似乎比想象的要少。一般来说,这些项目是非常松散耦合的,并且是相当可互换的。你可以使用warp (Yesod团队的web服务器)、heist (Snap团队的模板系统)和acid-state (Happstack项目的持久性系统)来构建一个网站。您还可以将snap-server与hamlet或persistent一起使用。

That said, the two projects definitely have some differences. The biggest difference I can point out objectively is that Yesod projects typically make heavy use of Template Haskell and quasiquoting to create concise DSLs, while Snap projects stick to building combinator libraries that favor composability. Just about any other differences I can think of will be subjectively biased towards Snap. The umbrella packages named after both projects are obviously going to make specific choices for the above mentioned components, and these choices will be reflected in the project dependencies. But that still doesn't mean that you can't pull in something different and use it as well.

Snap does have sessions and authentication, interfaces to several databases, and nice form handling (here and here) using digestive-functors that includes prepackaged support for arbitrarily nested dynamically sizable lists. These are just some of the growing ecosystem of pluggable snaplets. The sessions and authentication snaplets are written in a way that is back-end agnostic. So with a small amount of glue code you should be able to use it with just about any persistence system you can think of. In the future, Snap will stick with this policy as often as possible.

在很大程度上,我认为Snap、Yesod和Happstack的选择与其说是功能的问题,不如说是个人品味的问题。每当有人说一个框架没有另一个框架拥有的某些功能时,大多数情况下,通过导入必要的包,可以很容易地从另一个框架中引入缺失的功能。

编辑:关于三大Haskell web框架的更详细的比较,请参阅我最近的博客文章。使用更广泛的概括进行粗略(但可能更有用)的比较,请参阅我的Haskell Web框架比较矩阵


你说的可能是yesod的旧版。最新的yesod版本有html, javascript和css的简单语法。

yesod模板库hamlet的html语法是纯html,具有完整的开始和结束标记以及所有正常的html属性。是的,您可以省略结束标记,并为id和类属性使用快捷方式。但你不必这么做。您可以继续编写纯html。

不仅如此,html模板还可以驻留在单独的文件中,就像Snap的模板库Heist一样。

Java脚本模板(julius)是简单的javascript文件,也位于单独的文件中。

css模板确实有不同的语法,但最近版本的yesod现在也提供了普通的css语法。

如果你去抢劫,你将没有类型安全的url。

在Heist中,html模板每次都从硬盘读取。Yesod将所有模板直接编译到可执行文件中。没有从硬盘读取文件。因此,响应速度要快得多。您可以自己查看基准测试。

在Yesod中,您可以创建协作良好的小部件。Snap根本不涉及小工具。你得自己动手了。