Questions tagged «functional-programming»

函数式编程是一种范式,它试图通过对函数的链式评估来解决计算问题,这些函数的输出由输入决定,而不是由程序状态决定。在这种编程方式中,不赞成使用副作用和可变数据,并且通常严格隔离它们。

15
currying有什么好处?
我刚刚学习了有关curry的知识,尽管我认为我理解了curry的概念,但在使用它方面并没有看到任何大的优势。 作为一个简单的示例,我使用一个将两个值相加的函数(用ML编写)。该版本不使用curry fun add(x, y) = x + y 并称为 add(3, 5) 而咖喱版本是 fun add x y = x + y (* short for val add = fn x => fn y=> x + y *) 并称为 add 3 5 在我看来,这只是语法糖,它从定义和调用函数中除去了一组括号。我已经看到currying被列为功能语言的重要功能之一,但现在我对此有点不知所措。创建只使用每个参数的函数链而不是使用元组的函数的概念对于语法的简单更改而言似乎相当复杂。 稍微简单的语法是否是引起混乱的唯一动机,还是我错过了一些在我非常简单的示例中并不明显的其他优点?只是语法糖吗?

5
我是否也“聪明”,无法被小开发人员阅读?我的JS中的函数式编程过多?[关闭]
我是一名高级前端开发人员,使用Babel ES6进行编码。我们的应用程序的一部分进行了API调用,根据我们从API调用获得的数据模型,需要填写某些表格。 这些表格存储在一个双向链接的列表中(如果后端说某些数据无效,我们可以通过简单地修改清单。) 无论如何,有很多用于添加页面的函数,我想知道我是否太聪明了。这只是一个基本概述-实际的算法要复杂得多,有大量不同的页面和页面类型,但这将为您提供示例。 我认为,这是新手程序员处理该问题的方式。 export const addPages = (apiData) => { let pagesList = new PagesList(); if(apiData.pages.foo){ pagesList.add('foo', apiData.pages.foo){ } if (apiData.pages.arrayOfBars){ let bars = apiData.pages.arrayOfBars; bars.forEach((bar) => { pagesList.add(bar.name, bar.data); }) } if (apiData.pages.customBazes) { let bazes = apiData.pages.customBazes; bazes.forEach((baz) => { pagesList.add(customBazParser(baz)); }) } return pagesList; } …

3
蹦床为什么起作用?
我一直在做一些功能性JavaScript。我以为已经实现了尾叫优化,但是事实证明我错了。因此,我不得不自学流浪汉。在这里和其他地方稍作阅读后,我便掌握了基础知识并构造了我的第一个蹦床: /*not the fanciest, it's just meant to reenforce that I know what I'm doing.*/ function loopy(x){ if (x<10000000){ return function(){ return loopy(x+1) } }else{ return x; } }; function trampoline(foo){ while(foo && typeof foo === 'function'){ foo = foo(); } return foo; /*I've seen trampolines without this, mine wouldn't …




3
不带参数不返回任何值的函数的名称是什么?[关闭]
在Java 8的java.util.function程序包中,我们有: 功能:接受一个参数,产生一个结果。 消费者:采取一种论点,什么都不做。 供应商:不带任何争议,得出一个结果。 ...:其他处理原语,2个参数等的情况... 但是我需要处理“ 不带参数,不产生任何东西 ”的情况。 在中没有任何内容java.util.functionnal。 因此,问题是: “ 不带参数不返回任何值的函数 ”的名称是什么? 在Java 8中,其定义为: @FunctionalInterface public interface InsertANameHere { void execute(); } 执行程序已经存在并具有另一个用途:“ 一个对象,该对象执行已提交的可运行任务 ”。签名不匹配(execute(Runnable):void),甚至都不是一个功能接口。 Runnable存在,但它与线程上下文紧密关联: 这个包java.lang不是java.util.function。 javadoc指出:“ Runnable接口应该由实例打算由线程执行的任何类实现 ”。 名称“ Runnable”建议在线程内运行一些代码。


12
“一切都是地图”,我这样做对吗?
在我制作的这款游戏中,我观看了Stuart Sierra的演讲“ 数据中的思考 ”,并将其中的一种想法作为设计原则。不同之处在于他在Clojure中工作,而我在JavaScript中工作。我发现我们的语言之间存在一些主要差异: Clojure是惯用的函数式编程 大多数状态是不可变的 我从幻灯片“一切都是地图”中汲取了灵感(从11分钟6秒到> 29分钟)。他说的一些话是: 每当您看到一个带有2-3个参数的函数时,就可以将其变成一个映射并仅将一个映射传入。这有很多优点: 您不必担心参数顺序 您不必担心任何其他信息。如果有多余的键,那不是我们真正关心的。它们只是流过而不会干扰。 您不必定义架构 与传递对象相反,没有数据隐藏。但是,他认为数据隐藏可能会导致问题并被高估: 性能 易于实施 通过网络或跨流程进行通信后,无论如何,都必须让双方都同意数据表示。如果仅处理数据,则可以跳过这额外的工作。 与我的问题最相关。这是29分钟的时间: “使您的功能可组合”。这是他用来解释概念的代码示例: ;; Bad (defn complex-process [] (let [a (get-component @global-state) b (subprocess-one a) c (subprocess-two a b) d (subprocess-three a b c)] (reset! global-state d))) ;; Good (defn complex-process [state] (-> state subprocess-one …


4
函数式语言如何处理随机数?
我的意思是,在我阅读过的几乎所有有关函数式语言的教程中,都是关于函数的妙处之一,就是如果您两次调用具有相同参数的函数,那么总会得到同样的结果。 您究竟如何创建一个以种子为参数,然后基于该种子返回随机数的函数? 我的意思是,这似乎与功能方面的优势之一背道而驰,对吧?还是我在这里完全错过了什么?

4
是因为我编写不同的东西还是因为编译的方式不同,所以函数编程在多线程中是否更快?
我将深入研究函数式编程的世界,并且不断阅读有关函数式语言更适合多线程/多核程序的内容。我了解函数式语言如何做很多不同的事情,例如递归,随机数等,但是我似乎无法弄清楚函数式语言中的多线程是否更快,因为它的编译方式不同或因为我编写的方式不同。 例如,我已经用Java编写了实现某种协议的程序。在此协议中,双方互相发送和接收数千条消息,它们对这些消息进行加密并一次又一次地重新发送(并接收)。不出所料,当处理成千上万的规模时,多线程是关键。在此程序中,没有锁定。 如果我在Scala(使用JVM)中编写相同的程序,这种实现会更快吗?如果是,为什么?是因为写作风格吗?如果是因为写作风格,现在Java包含了lambda表达式,我不能将Java与lambda一起使用来达到相同的结果吗?还是因为Scala将以不同的方式编译事物而更快?

5
在函数式编程中,具有大多数不变的数据结构是否需要更多的内存使用?
在函数式编程中,由于几乎所有数据结构都是不可变的,因此当必须更改状态时,会创建一个新的结构。这是否意味着更多的内存使用量?我非常了解面向对象的编程范例,现在我正在尝试学习功能编程范例。一切不变的概念使我感到困惑。与使用可变结构的程序相比,使用不可变结构的程序似乎需要更多的内存。我什至以正确的方式看着这个吗?

4
箭头的目的是什么?
我正在通过Haskell学习函数式编程,并且尝试通过首先理解为什么需要它们来抢占概念。 我想知道功能编程语言中箭头的目标。他们解决什么问题?我检查了http://en.wikibooks.org/wiki/Haskell/Understanding_arrows和http://www.cse.chalmers.se/~rjmh/afp-arrows.pdf。我所了解的是,它们用于描述计算图,并且它们允许更轻松的无点样式编码。 本文假定无点样式通常更易于理解和编写。这对我来说似乎很主观。在另一篇文章(http://en.wikibooks.org/wiki/Haskell/StephensArrowTutorial#Hangman:_Main_program)中,实施了子手游戏,但是我看不到箭头如何使这种实现自然而然。 我可以找到许多描述该概念的论文,但没有找到动机。 我缺少什么?

12
为什么函数式编程在业界并不流行?现在流行吗?[关闭]
在我上大学的四年中,我们一直在使用多种函数式编程语言来使用许多函数式编程。但是我也使用了很多面向对象的程序设计,实际上,在做自己的小型项目来准备我的第一份工作时,我更多地使用了面向对象的语言。但是我经常希望在执行这些项目时使用功能性编程语言进行编码。 但是,在寻找工作时,很少会遇到需要功能编程语言知识的工作。 为什么函数式编程语言在业界没有得到更多使用?如今,有关函数式编程语言的新闻很多,所以我想知道函数式编程现在是否在行业中流行起来?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.