资讯专栏INFORMATION COLUMN

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

陈江龙 / 1912人阅读

摘要:原文是一门编译到的强类型静态类型语言它的功能受到的激发并且使用编写其目标是编译到同时保持清洁跟可读而且根据作者所说具备跟其他编译到的语言相互操作的能力继承了当中一些突出的功能其中有类型推断允许在任何可能的地方减少类型声明的书写一种类型构

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

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

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

类型推断: 允许在任何可能的地方减少类型声明的书写

Higher Kinded Polymorphism: 一种类型构造器之上的抽象机制,
是 Monads 跟 DSLs 的基础

模式匹配: 这种技术让开发者可以通过将函数实现拆分成多个 case
来写简洁而复杂的函数

类型类: 数据类型之上的抽象机制, 允许开发者在使用时不去思考本身数据结构

根据 Phil 所说, 互操作性是 PureScript 的另一个优势.
PureScript 提供了引用已有的 JavaScript 代码机制,
通过提供其数据和函数的类型, 然后作为正常的 PureScript 代码使用.
这样 PureScript 就有可能在应用的局部使用, 项目本身可以是 JavaScript 或者其方言.

InfoQ 跟 Phil Freeman 做了访谈来深入了解这门语言:

可以解释一下为什么你要创造 PureScript 吗? 主要的动机和目标是什么?

  

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

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, 不用安装就可以尝试这门语言.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85599.html

相关文章

  • gitbook: 前端好书推荐

    摘要:它大致概述并讨论了前端工程的实践如何学习它,以及在年实践时使用什么工具。目的是每年发布一次内容更新。前端实践第一部分广泛描述了前端工程的实践。对大多数人来说,函数式编程看起来更加自然。 1 Front-End Developer Handbook 2017 地址:https://frontendmasters.com/b... 这是任何人都可以用来了解前端开发实践的指南。它大致概述并...

    Ali_ 评论0 收藏0
  • gitbook: 前端好书推荐

    摘要:它大致概述并讨论了前端工程的实践如何学习它,以及在年实践时使用什么工具。目的是每年发布一次内容更新。前端实践第一部分广泛描述了前端工程的实践。对大多数人来说,函数式编程看起来更加自然。 1 Front-End Developer Handbook 2017 地址:https://frontendmasters.com/b... 这是任何人都可以用来了解前端开发实践的指南。它大致概述并...

    CocoaChina 评论0 收藏0
  • gitbook: 前端好书推荐

    摘要:它大致概述并讨论了前端工程的实践如何学习它,以及在年实践时使用什么工具。目的是每年发布一次内容更新。前端实践第一部分广泛描述了前端工程的实践。对大多数人来说,函数式编程看起来更加自然。 1 Front-End Developer Handbook 2017 地址:https://frontendmasters.com/b... 这是任何人都可以用来了解前端开发实践的指南。它大致概述并...

    Warren 评论0 收藏0
  • 2017值得一瞥JavaScript相关技术趋势

    摘要:值得一瞥的相关技术趋势从属于笔者的前端入门与工程实践,推荐阅读我的前端之路工具化与工程化获得更多关于年前端总结。的不少开发者都是的粉丝,他们的以及都是基于构建的。 2017值得一瞥的JavaScript相关技术趋势从属于笔者的Web 前端入门与工程实践,推荐阅读2016-我的前端之路:工具化与工程化获得更多关于2016年前端总结。本文主要内容翻译自,笔者对于每个条目进行了些许完善。本文...

    davidac 评论0 收藏0
  • [] Focal:类型安全、表达力强、可组合状态管理方案

    摘要:致力于为应用提供一个类型安全表达力强可组合的状态管理方案。是一组的命名空间。是内置组件的镜像,但允许组件的额外接受类型的数据。这次内容更新,是由组件处理的。这些小的组件不必知道所有的应用状态数据。这是因为大部分对的研究来自于。 Focal Focal 致力于为 React 应用提供一个类型安全、表达力强、可组合的状态管理方案。 用一个不可变的 (immutable) 、响应式的 (o...

    suemi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<