下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

必看对话函数式编程语言Roy之父Brian Mckenna

作者:课课家教育     来源: http://www.kokojia.com点击数:872发布时间: 2015-12-07 10:53:05

标签: 编程语言Java编写JavaScript

大神带你学编程,欢迎选课

  编程语言有多少种?你只需看下维基百科上的清单就知道了,种类极其繁多。当然我们不可能每一门语言都会,但学习下新事物,笔者认为还是很有必要的。本文就带大家认识一下函数式语言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组合工具非常好用,因为易于使用并允许编写出可复用的抽象代码。

必看对话函数式编程语言Roy之父Brian Mckenna_编程语言_Java编写

  Q4:请问monadic语法的非限制特性对于编程语言有什么好处?

  Brian McKenn:其实Roy的monadic没有实现非限制特性的,但是可以透过FFI实现。Scala则是实现得非常完美的一家。对于mondadic语法,请看下面的一个对比:

  [js] view plaincopyfor {

  name <- maybeFirstName

  user <- lookup(name)

  avatar <- getAvatar(user)

  } yield avatar

  该代码可简写为:

  [js] view plaincopymaybeFirstName.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:可以在类型里使用值。例如以下的链表倒转例子,进行二次倒转后链表恢复原样:

  [js] view plaincopyreverseInvolution : (xs : List a) -> reverse (reverse xs) = r

  或者我们可以在排序函数里生成一个按值大小进行倒序排列的链表。还有对于元编程来说,因为知道会传递什么样的值,所以可以计算出想要的类型。

  Q9:从你的博客里发现你学习了Goq和Agda。可以分享一下心得吗?

  Brian McKenn:Goq和Agda可以使人们知道可用的类型以及如何进行交互设计。同时它们可以帮助实现元编程,例如根据输入字符串进行静态字符串检测。

  Q10:你现在在关注哪些新语言和新技术?

  Brian McKenn:Gabriel Gonzalez编写的Morte是一个前途光明的分布式项目。它可以编写出非常高效的数据库代码,以函数而不是库的方式来进行包管理。具体介绍请看这里。

  Paul Chiusan编写的Unison试图解决编程中的“字符列表”问题,同时为程序员带来更好的函数式编程体验。文章很精彩,内心是否激情澎湃,是否还想了解更多关于视频教程的文章,课课家官网是一个知识的海洋

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程