对话函数式编程语言 Roy 发明人Brian Mckenna
| 2015-09-20 09:22
编程语言有多少种?你只需看下维基百科上的清单就知道了,种类极其繁多。当然我们不可能每一门语言都会,但学习下新事物,笔者认为还是很有必要的。本文就带大家认识一下函数式语言Roy。
本文译自国外记者Federico Carrone对Brian McKenn的专访,Brian是编程语言Roy之父。访谈内容涉及Roy与Purescript,依赖类型等事物的比较以及Brian对其它流行技术的看法。
Q1:Roy的主要特性有哪些呢?
Brian McKenn:Roy属于函数式编程语言,其特性有:
- 类型和类型推断;
- 代数数据类型和模式匹配;
- Monadic(单细胞)语法。
Q2:请问设计Roy的初衷是?
Brian McKenn:在用JavaScript工作几年后,我开始了Roy的编写。在学习Haskell的时候,它给了我很多启发和灵感。有类型概念的函数式编程使我在工作过程中获益良多,所以我想把它运用到Web编程里。
Roy与Purescript是很相似的,那么他们的区别在哪里呢?Roy的实施会更加便捷。如果PureScript在日后能够实现与Roy一样的快速实施,我会更推荐PureScript;因为它有更严谨的体系和更少的Bug。
Q3:你还编写了Lexer和Parser。请问编写的目的是什么呢?是现有工具存有不足还是其他原因?
Brian McKenn:我的Lexer(基于Java编写的C语言词法分析器)是对空格敏感的,并且会把数据传入Jison parser生成器。这与CoffeeScript所做的一样。一个自定义的Lexerr是有必要的,因为Jison lexer生成器对空格不敏感。
类似于Parsec和Trifecta的parser组合工具非常好用,因为易于使用并允许编写出可复用的抽象代码。
Q4:请问monadic语法的非限制特性对于编程语言有什么好处?
Brian McKenn:其实Roy的monadic没有实现非限制特性的,但是可以透过FFI实现。Scala则是实现得非常完美的一家。对于mondadic语法,请看下面的一个对比:
for {
name <- maybeFirstName
user <- lookup(name)
avatar <- getAvatar(user)
} yield avatar
该代码可简写为:
maybeFirstName.flatMap { name =>
lookup(name).flatMap { user =>
getAvatar(user)
}
}
这里就不存在非限制的作用了。
Q5:对于编程初学者来说,请问你有什么建议呢?
Brian McKenn:程序源代码是很好的学习资源。我建议透过PureScript和Idris编译器来进行学习。
Hackage上有很丰富的代码资源,例如以下的W算法实现:https://hackage.haskell.org/packages/。
Q6:请问我们该如何学习不同类型的系统?
Brian McKenn:Benjamin Pierce的文章类型和编程语言是非常好的学习资源。他深入地剖析了有关类型问题的细节,并结合OGaml给出了很多好的实例,非常值得一读。
Q7:近日你发表了关于Idris的看法,一种依赖类型的语言。请问你是怎么看待依赖类型的?
Brian McKenn:对于非依赖类型语言,对象的值是依赖于其它值的:函数!对于依赖类型来说,也有这种函数,但是还有种函数是把类型返回的。
Haskell有两种完全独立的语言:语言的值以及语言类型。最新版本的GHC可以把值传给类型,但如果你想编写一个函数来覆盖其它值,你就需要编写一个值级别和类型级别分开处理的版本。
依赖类型则无需这么转折。你只需编写一个函数就可以了,它可以根据实际情况进行复用。
Q8:请问依赖类型语言在实际中有什么亮点?
Brian McKenn:可以在类型里使用值。例如以下的链表倒转例子,进行二次倒转后链表恢复原样:
reverseInvolution : (xs : List a) -> reverse (reverse xs) = r
或者我们可以在排序函数里生成一个按值大小进行倒序排列的链表。还有对于元编程来说,因为知道会传递什么样的值,所以可以计算出想要的类型。
Q9:从你的博客里发现你学习了Goq和Agda。可以分享一下心得吗?
Brian McKenn:Goq和Agda可以使人们知道可用的类型以及如何进行交互设计。同时它们可以帮助实现元编程,例如根据输入字符串进行静态字符串检测。
Q10:你现在在关注哪些新语言和新技术?
Brian McKenn:Gabriel Gonzalez编写的Morte是一个前途光明的分布式项目。它可以编写出非常高效的数据库代码,以函数而不是库的方式来进行包管理。具体介绍请看这里。
Paul Chiusan编写的Unison试图解决编程中的“字符列表”问题,同时为程序员带来更好的函数式编程体验。