博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Haskell 是 Web 应用的好选择吗?
阅读量:5872 次
发布时间:2019-06-19

本文共 3075 字,大约阅读时间需要 10 分钟。

  hot3.png

Haskell 是 Web 应用的好选择吗?

未完,待续~~~~~~~~~~~~(博客里的Markdown有点不如人意,请见谅)

原文

Haskell是函数式编程人群的宠儿。但对于正式的web 应用它真的准备好了吗?抑或它还不够成熟而且太学院化。

我用Haskell花了近7个月(10个月)创建了一网站。我将分享我所遇到的挫折和取得的成功。并且对于那些想用Haskell 写web 应用的人,我会解释该语言的一些优缺点。

在页面空白处我会引用一些我所订阅的编程期刊上的一些话。

网站源代码开放,遵循GNU 开源协议。它共有2000(2500)行Haskell代码,包括一些SQL, Javascript, 和CSS。你可以通过阅读它,获得一些经验。

特点

代码演示

  • 使用FascCGI(SCGI)作为web 服务器(nainx(cherokee)作为应用服务器)
  • 使用PostgreSQL 数据库。
  • 基于cookie 验证用户。
  • 通过JavaScript 和JSON(AJAX/AJAJ)和用户异步交互。
  • 通过HTML 表单来收集数据。
  • 可通过电子邮件与用户交流。
  • (用memcached 处理缓存)
  • 实现一定制的论坛系统(涉及了多线程评论)

项目名为Vocabulink, 你可以马上点击欣赏一下它www.vocabulink.com

Haskell 能做到它?

我担心Haskell 不能完成这项任务。我有用Perl 和PHP 开发大型网站的工作经验,对于使用Haskell 开发大规模和任何正式产品,有无可行方案我还有一些怀疑。 那时,"Real World Haskell"还没有出版,我也没有任何大型的使用Haskell 开发的web 应用可参考。很多内置的库相比于我所要使用到的就像玩具一样。

但现在,网站已推出,我可以说:是的。Haskell 不但胜任,而且还是一个很不错的选择。Haskell 如此丰富和成熟令人惊讶。 更重要的是,Haskell 迫使我注意代码的短小精悍。有几次我快疯了(感觉语言真的像紧身衣一样),在它的训练下我已学会了严格的按游戏规则办事。

我创建了几乎所有我所要用到的库,它们在一起工作得很棒。Vocabulink 由12(一打的)的库构成。

这些库都很简单,不但实用而且很有意思。即使没有文档,只是阅读源代码,它们也能很容易理解。如果你需要,你也能很容易的修改它们。 对于如何使用语言,它们是极佳的资料和准则。

Haskell 和 SQL

坏消息是,Haskell 与关系数据库还没有成熟的类型安全的接口。和其它很多语言一样,你必须以字符串的形式建立SQL 命令。 HDBC 可预防SQL 注入攻击,但也只有这些。

(在这方面,Haskell 对你没有什么好处。事实上,Haskell 有一点冗赘和笨拙,除非你能够用monad 处理数据库。但你会习惯它的。)

使用PostgreSQL相关库时,我已开始注意这点,我希望在编译时能够检查语法、参数、和类型状态。通过内置的库,它可作为templatepg使用。 Vocabulink 现在就使用它执行数据库访问。

Monad

Haskell 的文章怎么能完全不谈monad 呢?你猜怎么着,我还不完全了解它们。 但不管怎么着,我仍然可以用它们写一些有用的程序。所以说,如果你没能很理解它们,不要用它们写一些重要的代码。 这也是一好的学习方式。

HTML 组合逻辑(和表单)

我喜欢HTML 组合逻辑。投入如此多的时间和精力在模板语言上,这让我吃惊。 但用模板,会让你失去一些抽象的能力。

一个很好的例子,就是Haskell 表单库。 虽然对于边缘仍有一些粗糙,但我发现,比起其它任何形式的分离,它让表单工作得更好。

异步 JavaScript(AJAX)

如果你知道怎么手写JavaScript, 那么创建动态页面,用Haskell 和用PHP 没什么不同。Haskell 有很好的JSON 和XML 库去生成和解析你所需要的。

调试

我认为缺乏一个好的传统的调试器,会成为一个突出的缺点和障碍。结果表明,它不是。 在纯语言中推理,比在命令式语言中推理,可以发现更多关于代码的东西。 而且到目前为止,能够溜过编译器的错误是罕见的。

我用过几次状态跟踪,但和在命令式语言中没什么两样。

布暑

因为我使用单线程的FastCGI(SCGI),所以布暑相当的简单。 (我只是一键复制静态的链接二进制文件到生产模式并重启它)我一键复制源代码到生产模式并编译它。 (这意味着在web 服务器上,我不需Haskell 编译器或任何库。缺点是,当前二进制文件有14 MB并且还在增长。)

关于布暑,我可以肯定,一旦www.vocabulink.com有更多的通信和需求,我还会说很多。更复杂的布暑。

错误处理

和一些人告诉你的相反,在纯函数编程中你仍然会看到错误。 直到现在,我遇到的最大(错误)来源于数据库。 我真心期待有更高层次的关系接口,在编译时能够捕捉到类型错误。

一个你可能遇到的,特别令人沮丧的问题就是,混合自己的monad时出现异常。 这意味着,你不能捕捉到它们,除非你打开了所有的额外的层(你添加的)(例如 Reader)

对于一个网络应用,这还不算很有破坏性。 异常被限制在当前请求。 或者你可以在它们发生时捕捉所有的异常并且使用Maybe 或Either monad(在Vocabulink里就是这么做) 然而,我更期待看到Haskell社区的改进。

总结

如果你在好奇Haskell 会如何发展,我鼓励你去尝试一下它。只有这一条路可以知道它真正是什么。

阅读Vocabulink。大多数写于我还是Haskell 新手时,因此一些理论知识,相比于这里的,那可能更容易理解。

然而,如果你仅仅是想实现你的ASAP 梦想,却不想在未来投入更高的维护费用,那么Haskell 可能并不适合你。 扩展到大量的服务器它可能要多一点点的工作,并且你可能没有足够的Haskell 程序员。

不要指望奇迹。Haskell 是无银弹的。但我认为知道这个结果,你会感到惊喜。如果没有其他的东西可以依赖,你就必须扩展你的大脑。

-----------------------------------------------------------

1、从我最初发表这篇文章,到每一次更新,我都标记好了它们之间的不同点。
2、每个晚上和周末我都花几个小时来编程。我估计每周大概花费30个小时来编写它。我并不是每周都很活跃(例如,在中间我停止了工作有两个月)所以我猜想,到目前为止
我总共花了大概500个小时。7个月mark 后,我工作于它已经不频繁了。
3、
4、我并没有声称我的代码是优雅的或符合习惯的,但是真实的代码是'狂热的'。
5、现在,gitit 已经发布。如果你还知道其它的,请给我留言。
6、我已修改Network, FastCGi 和Network.Memcache 库,让它们的默认输出为UTF-8格式。
7、我注意到了 HaskellDB, 但对于重大的使用,它看起来还不够成熟。期待那一天的到来 ...
8、想要更好的了解表单,可查看Chris Done 博客上的这篇文章。
9、我急切的盼望着支持动态链接的GHC 6.10 的发布。
10、我还没能做到优雅的重启。

转载于:https://my.oschina.net/kelby/blog/193135

你可能感兴趣的文章
Jsoncpp Compiler、Programming
查看>>
【转】Android用NDK和整套源码下编译JNI的不同
查看>>
Android开发学习总结(三)——appcompat_v7项目说明
查看>>
一个非常有用的辅助类 -- 阈值类的实现
查看>>
房费制 它 结账BUG
查看>>
解决Windows Server2008 R2中IE开网页时弹出阻止框(Windows Server2008网页无法打开的问题)...
查看>>
c++ 函数库查询
查看>>
分享非常有用的Java程序(关键代码)(七)---抓屏程序
查看>>
问题-[Delphi]通过Map文件查找内存地址出错代码所在行
查看>>
heap和stack有什么区别
查看>>
[翻译]用 Puppet 搭建易管理的服务器基础架构(3)
查看>>
价值博客们,技术博客
查看>>
Oracle 分组排序函数
查看>>
Android -- AudioPlayer
查看>>
Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
查看>>
HTML5游戏引擎排行榜
查看>>
BC 2015在百度之星程序设计大赛 - 预赛(1)(矩形区域-旋转卡)
查看>>
ServletContentLIstener接口演示ServletContext的启动和初始化
查看>>
限时授权复制文件 1.0(2015.9.2更新)
查看>>
C++ 'dynamic_cast' and Java 'instanceof' 使用对比
查看>>