Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


对话函数式编程语言 Roy 发明人Brian Mckenna

2015-9-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试图解决编程中的“字符列表”问题,同时为程序员带来更好的函数式编程体验。

发表评论


最新评论

我也要发表评论

相关阅读

返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。