编程语言有多少种?你只需看下 维基百科上的清单 就知道了,种类极其繁多。当然我们不可能每一门语言都会,但学习下新事物,笔者认为还是很有必要的。本文就带大家认识一下函数式语言Roy。
本文译自国外记者 Federico Carrone对 Brian McKenn 的专访,Brian是编程语言Roy之父。访谈内容涉及Roy与Purescript,依赖类型等事物的比较以及Brian对其它流行技术的看法。
Q1:Roy的主要特性有哪些呢?
Brian McKenn: Roy属于函数式编程语言,其特性有:
Q2:请问设计 Roy的初衷是?
Brian McKenn: 在用 JavaScript工作几年后,我开始了Roy的编写。在学习Haskell的时候,它给了我很多启发和灵感。有类型概念的函数式编程使我在工作过程中获益良多,所以我想把它运用到Web编程里。
Roy与Purescript是很相似的,那么他们的区别在哪里呢? Roy的实施会更加便捷。如果 PureScript在日后能够实现与Roy一样的快速实施,我会更推荐PureScript;因为它有更严谨的体系和更少的Bug。
Q3: 你还编写了L exer和Parser。请问编写的目的是什么呢?是现有工具存有不足还是其他原因?
Brian McKenn: 我的L exer(基于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 试图解决编程中的“字符列表”问题,同时为程序员带来更好的函数式编程体验。
(责编/夏梦竹)