如何通过整个Web应用程序堆栈利用Haskell类型的安全性?

dan*_*dan 6 javascript haskell yesod haskell-snap-framework

我想知道以CRUD为中心的Web应用程序可以从Haskell的类型系统中获益多少,特别是当前端使用像AngularJS这样的Javascript MVC框架构建时,它会传递无类型数据对象.

在我看来,只要将Haskell数据类型转换为传递给繁重的JavaScript MVC框架层的JSON对象,将Haskell的类型系统作为Web堆栈的一部分的好处就会开始大幅减少,因为没有办法让类型检查器确保整个Web应用程序中数据流的类型完整性.

例如,您可以更改数据库模式和关联的Haskell类型,但类型检查器将无法告诉您JavaScript MVC前端的哪些部分也需要更新.我认为这是一个问题.

我是否正确地陈述了问题,如果是这样,Haskell Web应用程序开发人员在这一点上给出了什么建议?

mig*_*yte 5

自从我们最近开始一个具有大量javascript前端的项目以来,我们一直在努力解决这个完全相同的问题.我的轶事观察是,我们在javascript应用程序中遇到的错误比以前只使用Snap并使用Heist生成HTML的应用程序有很多错误.我们还没有做出任何决定,但这里有一些我们一直在考虑的可能的解决方案:

瘦Javascript包装

这对我来说是非常不满意的解决方案.对Javascript略有改进,但是不要接近我给Haskell带来的东西.

更多功能和类型安全的前端语言

  • Fay是Haskell的一个合适的子集,可以编译为Javascript.它肯定有一些吸引力,但不允许您访问所有Haskell.最后我听说它不支持类型类,我想这会很快成为障碍.
  • 榆树
  • 罗伊

这些解决方案(以及前一组)的问题在于,如果您的后端是用Haskell编写的,那么您仍然会遇到阻抗不匹配,因为您的前端语言不是Haskell.这使得您的代码更少DRY,因为您必须最终在Haskell和前端语言中定义相同的数据结构.当您在Haskell中更改它们时,您不会收到错误,指出前端代码需要更改的位置.该应用程序刚刚破解.

将Haskell编译为Javascript

这里的新游戏是ghcjs.这是一个非常有前景的项目,但至少在GHC 7.8发布之前,我认为它不适合生产.这有望在下周发生.一旦7.8出门,你仍然需要考虑到ghcjs仍然很新.即使在假设的情况下,它是100%功能完整且第一个版本完美运行,您仍然必须记住,在Haskell + ghcjs与Angular等高级javascript框架一样有效之前,必须构建相当数量的基础架构,灰烬等

更新2016年9月:现在,在我最初写这个答案差不多三年后,GHCJS已经有了很大的改进.仍有进一步改进的空间,但我已将它用于生产应用程序,并且它运行良好.当与Reflex FRP库结合使用时,它特别强大,可以更轻松地构建反应式UI.

使用EDSL从Haskell生成Javascript

如果您遇到相对受限制的问题,则可以在生成javascript的EDSL之上执行所有应用程序工作.我们已经拥有了出色的jmacro软件包来处理生成Javascript的低级别问题.您可以利用它并生成使用适合您的应用程序的任何其他JavaScript库的代码.这可能是javascript + jquery,D3.js,甚至是使用更高级别的javascript框架(如Angular或Ember)的代码.我倾向于认为Angular比Ember更容易生成代码,因为它的简单性和更强的封装性.

Greenfield是一个字节码VM,专为浏览器中的函数语言而设计

这只是我天空中的一个馅饼.我不认为它真的很实用,因为它需要大量的工作并且很难获得采用.但我喜欢至少提到完整性的想法.其他人指出asm.js已经差不多了.情况可能就是如此,但从一开始就将尾调优化设计到VM级别会很好.