Questions tagged «functional-programming»

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

9
退货被认为有害吗?没有它,代码可以起作用吗?
好的,标题有点clickbaity,但是我已经很认真地告诉别人,请不要踢一会儿。我喜欢它如何鼓励以真正的面向对象的方式将方法用作消息。但是,这个棘手的问题一直困扰着我。 我开始怀疑编写良好的代码是否可以同时遵循OO原则和功能原则。我正在设法调和这些想法,而我所坚持的最大症结是return。 纯函数具有两种性质: 使用相同的输入重复调用它总是得到相同的结果。这意味着它是不可变的。其状态仅设置一次。 它不会产生副作用。调用它引起的唯一变化就是产生结果。 那么,如果您发誓要使用return它来传达结果,那么如何才能完全发挥功能呢? 该出来,不问用什么有些人会考虑副作用思想工作。当我处理一个对象时,我不会询问它的内部状态。我告诉它我需要做的事情,它使用其内部状态来弄清楚该如何处理我已经告诉它要做的事情。一旦我告诉了我,我就不会问它做了什么。我只是希望它对它被告知要做的事情有所作为。 我认为“告诉,不要问”不仅仅是封装的另一个名称。当我使用时,return我不知道叫我什么。我不能说这是协议,我必须强迫它处理我的协议。在许多情况下,这表示为内部状态。即使暴露的不是确切的状态,通常也只是对状态和输入args进行一些计算。拥有一个响应界面,可以将结果整理成比内部状态或计算更有意义的结果。那就是信息传递。请参阅此示例。 回想过去,当磁盘驱动器中实际上装有磁盘,而拇指驱动器是您在汽车上做的,而车轮太冷而无法用手指触摸时,我就被教给了令人讨厌的人们如何考虑没有参数的功能。void swap(int *first, int *second)似乎很方便,但是我们鼓励我们编写返回结果的函数。因此,我坚信信念,并开始遵循。 但是现在我看到人们在构建体系结构,在该体系结构中,对象可以通过其构造方式控制结果的发送位置。这是一个示例实现。再次注入输出端口对象似乎有点像out参数的想法。但这就是告诉对象不要告诉其他对象他们所做的事情的方式。 当我第一次了解副作用时,我将其视为输出参数。有人告诉我们不要以令人惊讶的方式进行某些工作,也就是说,不遵守return result公约,以使人们感到惊讶。现在可以肯定,我知道有很多并行异步线程问题会带来副作用,但是返回实际上只是一个约定,您可以将结果压入堆栈,以便以后调用时可以将其弹出。真的就是这些。 我真正想问的是: 是return避免所有这些副作用的苦难并获得没有锁等的线程安全性的唯一方法。还是我可以跟着说,不要以纯粹的功能性方式提出要求?

2
为什么(或为什么不这样)存在性类型在函数式编程中被认为是不好的做法?
我可以使用哪些技术来一致地重构代码,以消除对存在类型的依赖?通常,这些用于取消您不希望使用的类型的构造的资格,并允许在对给定类型有最少了解的情况下进行消耗(或者我的理解是这样)。 有没有人想出一种简单而一致的方法来消除对代码中这些内容的依赖,而这些代码仍然保留了一些好处?还是至少有任何一种滑入抽象的方式,使得它们可以删除而无需大量的代码改动来应对这种变更? 您可以在此处阅读有关存在性类型的更多信息(“如果您敢..”)。

7
非FP人员可以理解少量的函数式编程吗?[关闭]
案例:我在一家公司工作,用Python编写一个处理数组中大量数据的应用程序。我目前是该程序的唯一开发者,但将来(1-3年)可能会被其他一些程序员使用/修改/扩展,目前我还不知道。那时我可能不会在那里直接提供帮助,但是如果有时间的话,也许可以通过电子邮件提供一些支持。 因此,作为一个学习过函数式编程(Haskell)的开发人员,我倾向于解决例如以下过滤问题: filtered = filter(lambda item: included(item.time, dur), measures) 其余的代码是OO,这只是我想解决的一些小案例,因为根据我的说法,它更简单,更漂亮。 问题:今天可以编写这样的代码吗? 没有编写/学习FP的开发人员如何对这样的代码做出反应? 可读吗? 可以修改吗? 我是否应该写文件给孩子解释该行的用途? # Filter out the items from measures for which included(item.time, dur) != True 我问过我的老板,他只是说“ FP是黑魔法,但如果它有效并且是最有效的解决方案,那么可以使用它。” 你对此的看法如何?作为非FP程序员,您如何应对代码?代码是“ googable”的,这样您可以了解它的作用吗?我希望收到反馈。

3
“ Lambda the Ultimate”一词的由来和含义是什么?
几年来,我一直在纠缠于函数式编程语言,而我一直遇到这个短语。例如,这是“小计划者”的一章,该名字肯定早于博客。(否,该章无助于回答我的问题。) 我了解lambda的含义,匿名函数的概念既简单又强大,但是我无法理解在这种情况下“最终”的含义。 我看过这个短语的地方: 小策划人》第8章的标题 博客:http://lambda-the-ultimate.org/ 一系列“ Lambda the Ultimate X”论文:http : //library.readscheme.org/page1.html 我觉得我在这里缺少参考资料,有人可以帮忙吗?

7
您怎么称呼一个函数,其中相同的输入将始终返回相同的输出,但也会产生副作用?
假设我们有一个正常的纯函数,例如 function add(a, b) { return a + b } 然后我们对其进行更改,使其具有副作用 function add(a, b) { writeToDatabase(Math.random()) return a + b; } 据我所知,它并不是纯函数,因为我经常听到人们称纯函数为“无副作用的函数”。但是,就其对于相同输入将返回相同输出的事实而言,它的行为确实类似于纯函数。 这种函数类型是否有其他名称,是未命名的,还是实际上是纯函数,而我对纯函数的定义有误?


7
函数式编程正在上升吗?
我最近注意到功能编程语言越来越流行。我最近看到了Tiobe索引与去年相比如何显示出其受欢迎程度的增加,尽管根据该索引,其中大多数甚至都没有进入前50种最受欢迎​​的语言。 这已经有相当长的一段时间了。函数式编程根本没有像其他模型那样流行(即,面向对象的编程)。 但是,我已经看到了对函数式编程功能的浓厚兴趣,现在,多核越来越流行,开发人员开始对由Haskell和Erlang等语言在过去探索的其他并发模型表现出兴趣。 我非常感兴趣地看到,尽管缺乏社区的广泛认可,但越来越多的此类语言继续出现。Clojure(2007),Scala(2003),F#(2002)只是最近十年的三个例子。 我本人一直在花时间学习Haskell和Scala。尽管存在了这么长的时间,但对于我来说,这是一个全新的范例,我发现了巨大的潜力。 当然,我最大的问题是,这些方法中的任何一种是否将变得足够流行,以至于考虑对其进行任何努力,但这是一个问题,即使人们对此大惊小怪,连Mandrake都无法回答。 我想问的是: 在哪种情况下,我应该考虑一种更适合执行给定任务的功能编程语言?除了最近流行的并行编程多核问题。 如果我决定改用函数式编程语言,那您会认为这是我将要面临的最大陷阱?(除了范式更改和由于懒惰的评估而难以评估性能)。 有这么多的函数式编程语言,您将如何选择一种更适合您的需求的语言? 任何进一步研究的建议都将受到欢迎。 我在网上搜索了一些意见,看来所有这些重新流行起来都来自这样的想法,即现在我们将要碰到摩尔定律,函数式编程语言将会出现并英勇地拯救我们。但是,如果是这样的话,我想说现有流行语言有更多的可能性适应这种范例。 你们当中有些人可能每天都有使用这些语言的丰富经验,可以为您提供有关该主题的更多见解。您的所有意见将得到更好的理解和认真考虑。 提前致谢!

8
函数语言是否更擅长递归?
TL; DR:功能语言比非功能语言处理递归的效果好吗? 我目前正在阅读Code Complete2。在本书的某些时候,作者警告我们有关递归的问题。他说,应尽可能避免这样做,并且使用递归的功能通常不如使用循环的解决方案有效。例如,作者使用递归编写了一个Java函数,以计算数字的阶乘(这样可能不完全相同,因为目前我没有这本书)。 public int factorial(int x) { if (x <= 0) return 1; else return x * factorial(x - 1); } 这是一个不好的解决方案。但是,在函数式语言中,使用递归通常是首选的处理方式。例如,以下是Haskell中使用递归的阶乘函数: factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n - 1) 并被广泛接受为一个好的解决方案。正如我所看到的,Haskell非常经常使用递归,并且我看不到它被皱眉的任何地方。 所以我的问题基本上是: 功能语言比非功能语言处理递归更好吗? 编辑:我知道我使用的示例不是最好的例子来说明我的问题。我只是想指出,Haskell(通常是功能语言)比非功能语言使用递归的频率更高。

1
如何组织功能程序[关闭]
可能重复: 函数式编程与OOP 如何使用函数式编程编写可管理的代码? 在OOP中,代码的基本组织单位是类。Java,C#和类似语言的一种常用方法是围绕每个类使用一个文件,文件名紧随类名之后来组织代码。 您可以将这些类别中的每一个视为组织的单位,以对单个概念进行分组。 这些类位于名称空间中,该名称空间通常遵循解决方案/项目中文件的目录结构。命名空间是另一个组织层次。 功能语言的大型项目通常是如何组织的? 如何确定如何将功能拆分为不同的文件? 是否在文件旁边使用其他分组单位? 通常在单个文件中如何组织代码?

5
依赖倒置与高阶函数有何关系?
今天我刚刚看到这篇文章,它描述了SOLID原理在F#开发中的相关性- F#和设计原则– SOLID 在谈到最后一个问题时-“依赖倒置原则”,作者说: 从功能的角度来看,这些容器和注入概念可以通过简单的高阶函数或内置在语言中的“中间钻孔”模式来解决。 但是他没有进一步解释。因此,我的问题是,依赖项反转与高阶函数有何关系?


2
对纯函数式语言的误解?
我经常遇到以下语句/参数: 纯函数式编程语言不允许有副作用(因此在实践中很少使用,因为任何有用的程序的确有副作用,例如,当它与外界交互时)。 纯函数式编程语言不允许编写维护状态的程序(这使编程变得很尴尬,因为在许多应用程序中您确实需要状态)。 我不是功能语言方面的专家,但是到目前为止,这是我对这些主题的了解。 关于第1点,您可以使用纯函数式语言与环境进行交互,但是必须显式标记引入副作用的代码(函数)(例如,在Haskell中通过单子类型)。而且,据我所知,即使不是首选工作方式,也应该可以进行副作用计算(破坏性地更新数据)(使用monadic类型?)。 关于第2点,据我所知,您可以通过几个计算步骤(在Haskell中,再次使用monadic类型)对值进行线程化来表示状态,但是我没有这样做的实践经验,我的理解还很模糊。 那么,以上两个陈述在任何意义上是正确的还是仅仅是对纯函数式语言的误解?如果是误解,它们是怎么产生的?您能写一个(可能很小的)代码片段来说明Haskell惯用的方式来(1)实现副作用和(2)实现有状态的计算吗?

5
不变性是否完全消除了多处理器编程中对锁的需求?
第1部分 显然,不变性可以最大程度地减少多处理器编程中对锁的需求,但是它消除了这种需求吗?还是存在仅不变性还不够的情况?在我看来,您只能推迟处理和封装状态,直到大多数程序必须实际执行某些操作(更新数据存储,生成报告,引发异常等)之前。这样的动作能否始终不加锁地进行?扔掉每个对象并创建一个新对象而不是更改原始对象(对不变性的粗略看法)的纯粹行动是否提供了对进程间争用的绝对保护,还是有些仍然需要锁定的情况? 我知道很多函数式程序员和数学家都喜欢谈论“无副作用”,但是在“现实世界”中,所有事情都有副作用,即使这是执行机器指令所需的时间。我对理论/学术答案和实际/现实答案都感兴趣。 如果不变性是安全的,那么在给定某些界限或假设的情况下,我想知道“安全区”的边界到底是什么。可能的边界的一些示例: 输入输出 异常/错误 与其他语言编写的程序的交互 与其他机器(物理,虚拟或理论上的机器)的交互 特别感谢@JimmaHoffa 的评论,这开始了这个问题! 第2部分 多处理器编程通常用作优化技术-使某些代码运行更快。什么时候使用锁和不可变对象更快? 考虑到阿姆达尔定律所规定的限制,与可变对象锁定相比,什么时候可以实现更好的整体性能(考虑或不考虑垃圾收集器)? 摘要 我将这两个问题合并为一个,以尝试了解边界不变性在哪里作为线程问题的解决方案。

5
在函数式编程的背景下谈论贫血模型仍然有效吗?
DDD的大多数战术设计模式都属于面向对象的范式,而贫乏的模型则描述了将所有业务逻辑都置于服务而非对象中的情况,从而使它们成为一种DTO。换句话说,贫血模型是程序样式的同义词,不建议用于复杂模型。 我在纯函数式编程方面不是很有经验,但是我想知道DDD如何适合FP范例以及在这种情况下是否仍然存在“贫血模型”一词。 更新:纽崔里出版了有关该主题的书籍和视频。

3
什么是参照透明性?
我已经看到在命令式范式中 f(x)+ f(x) 可能与以下内容不同: 2 * f(x) 但是在功能范式中应该相同。我曾尝试在Python和Scheme中实现这两种情况,但对我来说,它们看起来非常简单。 有什么例子可以指出与给定功能的区别?

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.