jjzjj

javascript - 如何在整个 Web 应用程序堆栈中利用 Haskell 类型安全?

coder 2024-12-21 原文

我想知道以 CRUD 为中心的 Web 应用程序可以从 Haskell 的类型系统中获益多少,尤其是当前端是使用 Javascript MVC 框架(如 AngularJS 传递无类型数据对象)构建时。

在我看来,一旦将 Haskell 数据类型转换为 JSON 对象,并将其传递给繁重的 JavaScript MVC 框架层,将 Haskell 的类型系统作为 Web 堆栈的一部分的好处就会开始急剧下降,因为没有让类型检查器确保通过整个 Web 应用程序的数据流的类型完整性的方法。

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

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

最佳答案

自从我们最近启动了一个包含大量 javascript 前端的项目以来,我们一直在为这个完全相同的问题苦苦思索。我的轶事观察是,与以前仅使用 Snap 并通过 Heist 生成 HTML 的应用程序相比,我们在 javascript 应用程序中存在的错误要多得多。我们尚未做出任何决定,但以下是我们一直在考虑的一些可能的解决方案:

精简 Javascript 包装器

这些对我来说是非常不令人满意的解决方案。在 Javascript 上略有改进,但与使用 Haskell 获得的东西相比,还差得远。

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

  • Fay是编译为 Javascript 的 Haskell 的真子集。它肯定有一些吸引力,但不会让您访问所有的 Haskell。最后我听说它不支持类型类,我想这很快就会成为一个障碍。
  • Elm
  • Roy

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

将 Haskell 编译为 Javascript

镇上的新游戏是 ghcjs .这是一个非常有前途的项目,但我认为至少在 GHC 7.8 发布之前它不适合生产。这有望在下周内发生。一旦 7.8 发布,您仍然必须考虑到 ghcjs 仍然很新。即使在功能 100% 完成并且第一个版本完美运行的假设场景中,您仍然必须记住,在 Haskell+ghcjs 与像 Angular 这样的高级 javascript 框架一样有效之前,必须构建相当数量的基础设施, Ember 等

2016 年 9 月更新:现在,在我最初写这个答案差不多三年后,GHCJS 有了很大的改进。还有更多改进的空间,但我已经将它用于生产应用程序并且效果很好。当与 Reflex FRP library 结合使用时,它特别强大这使得构建响应式 UI 变得更加容易。

使用 EDSL 从 Haskell 生成 Javascript

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

Greenfield 为浏览器中的函数式语言设计的字节码 VM

这只是我的天上掉馅饼的想法。我不认为它真的很实用,因为它需要大量的工作并且很难被采用。但我想至少提一下完整性的想法。其他人指出 asm.js 已经差不多是这样了。情况可能是这样,但从一开始就将诸如尾调用优化之类的东西设计到 VM 级别会很好。

关于javascript - 如何在整个 Web 应用程序堆栈中利用 Haskell 类型安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20077601/

有关javascript - 如何在整个 Web 应用程序堆栈中利用 Haskell 类型安全?的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  10. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

随机推荐