Tag: 函数式编程的

Y-Combinator实例

最近我一直在阅读关于函数式编程的一些知识,我正在努力研究Y-Combinator。 我知道你可以使用Y-Combinator来有效地实现recursion,而不是直接支持recursion的语言。 但是,我可能使用的每种语言已经支持recursion,所以我不确定使用Y-Combinator是多么有用。 Y-Combinator的用法有没有更好的实用例子? 有没有人真的在生产代码中使用过? 或者是使用Y-Combinator实际上只是一个弯曲的学术练习(虽然是一个很酷的)。

Haskell的编码风格:map,fmap还是<$>?

是否有理由select下列其中一种符号,或者这只是一个优先select? map toLower "FOO" fmap toLower "FOO" toLower <$> "FOO" 另外:我意识到<$>和`fmap`是一样的。 我是否正确地认为map是fmap一般forms?

是不是在尾部recursion风格的代码?

我有点新的斯卡拉试图读大卫波拉克开始Scala。 他定义了一个简单的recursion函数来加载文件中的所有string: def allStrings(expr: => String): List[String] = expr match { case null => Nil case w => w :: allStrings(expr) } 这是优雅和令人敬畏的,除了它已经引发了一个StackOverflowexception,当我试图加载一个巨大的字典文件。 现在据我所知,Scala支持尾recursion,所以函数调用不可能溢出堆栈,可能编译器不能识别它? 所以一些谷歌search后,我试着@tailrec注释来帮助编译器,但它说 error: could not optimize @tailrec annotated method: it contains a recursive call not in tail position def allStrings(expr: => String): List[String] = 我理解尾recursion错了吗? 我如何解决这个问题?

有什么工具可以执行Scala代码的静态分析吗?

有什么工具可以执行Scala代码的静态分析,类似于FindBugs和PMD for Java或Splint for C / C ++? 我知道FindBugs在编译Java时产生的字节码上工作,所以我很好奇它是如何在Scala上工作的。 谷歌search(截至2009年10月27日)显示非常less。 谷歌search(截至2010年2月1日)揭示了这个问题。

什么是“多态点菜”,我怎样才能从中受益呢?

Rick Hickey在Simple Made Easy的演讲中谈到了“ 多态点菜 ”(约30点到video)。 在同样的背景下,他还提到了Haskell的types类和Clojure的多方法 (和协议)。 由于我对这些概念不是很熟悉,所以我想了解它在实现简单性时的用处。 我对Scala中这个概念的任何例子或展示特别感兴趣。

在函数式编程中什么是无意义的风格?

我最近注意到的一个短语是“免费”风格的概念… 首先是这个问题, 也是这个问题。 然后,我在这里发现他们提到“另一个可能值得讨论的话题是作者不喜欢自由式的风格。 什么是“免费”的风格? 有人能给出一个简洁的解释吗? 它与“自动”咖喱有关吗? 为了了解我的水平 – 我一直在教自己的Scheme,并写了一个简单的Scheme解释器…我明白什么是“隐式”currying,但我不知道任何Haskell或ML。

在Scala中val-mutable与var-immutable

在Scala中有没有关于什么时候对可变集合使用val与将不可变集合使用var的指导? 或者你应该真正的目标为val与一个不可改变的集合? collections这两种types的事实给了我很多的select,而且我经常不知道如何做出这样的select。

函数式语言(特别是Erlang)如何/为什么能很好地扩展?

我一直在观察函数式编程语言和function的日益增长的可见性。 我看着他们,没有看到上诉的原因。 然后,最近我在Codemash参加了Kevin Smith的“Erlang基础”演示。 我喜欢这个演示文档,并了解到函数式编程的很多属性使得避免线程/并发问题变得更容易。 我知道状态和可变性的缺乏使得multithreading无法改变相同的数据,但凯文说(如果我理解正确的话)所有的通信都是通过消息发生的,消息是同步处理的(同样避免了并发问题)。 但是我已经读过Erlang用于高度可扩展的应用程序(爱立信首先创build它的全部原因)。 如果每件事都作为一个同步处理的消息来处理,那么如何有效地处理每秒数千个请求呢? 这不就是为什么我们开始走向asynchronous处理 – 所以我们可以利用同时运行多个线程的操作,并实现可扩展性? 看起来这样的架构虽然更安全,但在可扩展性方面却倒退了一步。 我错过了什么? 我了解Erlang的创build者故意避免支持线程以避免并发问题,但我认为multithreading对于实现可伸缩性是必需的。 函数式编程语言如何能够固有地线程安全,但仍然可以扩展?

任何Javascript引擎尾部调用优化?

我有一个我已经在Javascript中实现的尾recursion寻路algorithm,并想知道是否有任何(所有?)浏览器可能会得到堆栈溢出exception。

在Swift数组上设置操作(联合,交集)?

是否有任何标准库调用可用于对两个数组执行集合操作,或者自己实现这样的逻辑(理想情况下尽可能在function上和效率上尽可能)?