[译] PureScript: 一门编译到 JavaScript 的 Haskell 方言

原文: http://www.infoq.com/news/2014/09/purescript-haskell-javascriptjavascript


PureScript 是一门编译到 JavaScript 的强类型静态类型语言.
它的功能受到 Haskell 的激发, 而且使用 Haskell 编写, 其目标是:
"编译到 JavaScript 同时保持清洁跟可读" 并且根据 PureScript 做者 Phil Freeman 所说,
PureScript 具有跟其余编译到 JavaScript 的语言相互操做的能力.java

PureScript 继承了 Haskell 当中一些突出的功能, 其中有:node

  • 类型推断: 容许在任何可能的地方减小类型声明的书写
  • Higher Kinded Polymorphism: 一种类型构造器之上的抽象机制,
    是 Monads 跟 DSLs 的基础
  • 模式匹配: 这种技术让开发者能够经过将函数实现拆分红多个 case
    来写简洁而复杂的函数
  • 类型类: 数据类型之上的抽象机制, 容许开发者在使用时不去思考自己数据结构

根据 Phil 所说, 互操做性是 PureScript 的另外一个优点.
PureScript 提供了引用已有的 JavaScript 代码机制,
经过提供其数据和函数的类型, 而后做为正常的 PureScript 代码使用.
这样 PureScript 就有可能在应用的局部使用, 项目自己能够是 JavaScript 或者其方言.git

InfoQ 跟 Phil Freeman 作了访谈来深刻了解这门语言:github

能够解释一下为何你要创造 PureScript 吗? 主要的动机和目标是什么?spring

我是一年前开始 PureScript 项目的, 那时我在进行一个中等的 JavaScript 应用,
那个项目后来用 TypeScript 重写了. 用 TypeScript 不少时候生成力是很高的
只是应用中一小部分我以为用强类型系统会带来更多的好处.
那时已经有不少编程语言提供了颇有表达能力的类型系统,
但是, 没有一个同时能结合我想要的其余功能一块儿使用.
更准确地说, 我想要一门 Haskell 语法的语言, 能生成干净可读的 JavaScript,
只是不须要 Haskell 那样一个运行环境.
我知到若是我开始本身写编译器的话后面我就是要在 Haskell 设计这门语言,
可是我决定了, 只想要 Haskell 当中简单的部分来实现 PureScript,
由于我想要吸引更多的编译器开发者.
考虑这一点, 这个项目已经成功了, 由于编译器如今有了很棒的开发者社区.npm

PureScript 的主要功能是什么?编程

一套简单的 FFI, 表达能力强的类型系统, 有规律的生成代码.
简单说就是 PureScript 提供了"更好的环境的写有规则的 JavaScript"后端

能不能总结下 PureScript 带来的比原生 JavaScript 好的地方?数据结构

一个巨大的好处是所以可以自信地重构巨大的代码库而不破坏已有的功能.
当你决定使用纯函数式编程以后 - 纯函数, 不可变数据类型, 明确的反作用, 这些
你就能够在编译器的协助下强力地重构你的代码.
另外一个好处是类型系统的表达能力, 能开发者能更多属性的断言,
这在目前单纯 JavaScript 的工具来讲是难以作到的.
好比说构造 DSL 让它的数据类型在结构上就保证正确,
好比: 二叉树被保证是平衡的, HTML 节点保证有正确的属性, 等等
同时这能够是一套渐变的方案, 不须要依赖特定的 IDE.
最终 PureScript 这样的语言实现了强大的抽象能力, 其余语言没法达到,
包括参数化的多态(?parametric polymorphism), 高阶函数, 类型类等等工具.

PureScript 集成了 Haskell 当中一些功能, 好比类型推断, 类型类等等
这两门语言差异最大是在哪里?

简单说 PureScript 选用了 Haskell 的语法, 但在语意方面源自 JavaScript.
好比 PureScript 是非惰性求值的, 这个就不像 Haskell.
还有 PureScript 只是在单根函数的层面进行了尾递归优化,
就有必要注意 Haskell 经常使用风格在这里会栈溢出(好比 monadic recursion).
类型系统中也有一些重要的去写.
PureScript 受 Haskell 影响有一些不错的功能(好比多参数类型类, rank-N types),
但也有不少 Haskell 功能咱们是没有的(type families, polykinds, datakinds 等等).
也有些新奇功能是 PureScript 有但 Haskell 没的(extensible records 和 extensible effects)

你怎么对比 PureScript 和其余 Haskell 编译 JavaScript 方言, 好比 UHC, ghcjs?

不少 Haskell 类的 Altjs 语言, 好比 Fay, Haste, GHCJS,
它们但愿的是编译 Haskell 的子集到 JavaScript, 保留 Haskell 的语义.
这个想法很棒, 由于有大量的 Haskell 代码那样就能在 JavaScript 代码中重用.
PureScript 不是 Haskell 的子集, 而是采用了 JavaScript 的语义.
不过好处是 PureScript 的 FFI 很好用, 咱们很容易集成已有的 JavaScript 模块.
好比说那些 npm 当中已经提供了的模块. 这带来了不同的开发模式.
PureScript 内在当中更接近 Roy 或者 JMacro 这样的语言.
实际上 Roy 很大地影响了 PureScript 的设计.
Elm 是另外一个有趣的 Haskell 方言.
Elm 主要是实现了纯函数编程, 以及 FRP, 用来实现交互式的 Web 应用.

能简短分享一下 PureScript 将来的想法吗? roadmap 上有什么?

咱们目前专一于发布下一版的编译器管工具,
但愿能包含二进制发布文件, 针对三个主要的平台.
咱们也花了很多时间开发一个自举的 PureScript 编译器.
若是能用 npm install purescript 安装编译器就很赞了.
下一个版本以后, 咱们就能考虑一下不少有意思的功能, 好比:
type wildcards, 模版元编程, idiom brackets 还有 sourceMaps.
还有一些兴趣在于不一样的编译器后端, 加上最近的 Lua 后端,
也有一些讨论是关于可能会有的 Python 后端的.
固然, 咱们也不缺各类有趣的类库跟工具去写. 开发者社区很热情,
任何有兴趣贡献的人均可以看咱们 Freenode 上的 #purescript 频道.

PureScript 是个开源项目, 预编译的二进制文件也支持 Linux.
两份适合开始学习这门语言的资源是Phil Freeman 写的Leanpub 的电子书,
还有网页版的 Try PureScript, 不用安装就能够尝试这门语言.

相关文章
相关标签/搜索