Questions tagged «functional-programming»

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

5
可以在没有状态的情况下表示任何程序任务吗?
这是一个理论问题,但是经过多年的编程之后,我意识到现在是“正常的”命令式技术,主要使用C ++,我发现了函数式编程的另一个领域,在偶然学习JavaScript时偶然发现了这个问题。 这使我想知道您是否可以用一个纯粹的功能且没有状态的不同实现在技术上替换任何完整的面向状态的程序? 这是一个有趣的想法,我必须承认,函数编程的清晰性和优雅性确实让我大吃一惊。

1
为什么命令式编程比函数式编程更受青睐?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 背景:我是函数式编程的支持者,他在VB.NET商店工作,那里的主流思维模型是命令式编程。作为我们系统的基础是WinForms,我可以理解我们不会完全摆脱命令式编程,但是我仍然尽可能尝试使用FP(主要是通过Linq),因为我相信它的优点。 针对FP的争论和反议 可能会注意到,流利的Linq效率不如命令式效率高,因为这种样式将一个序列处理为另一个序列并重复该序列。通常,与命令式方法相比,它需要花费更多的遍数,而命令式方法可以更好地进行优化以避免序列中的重复遍历。因此,主管无法理解为什么我会选择一种明显“效率较低”的功能方法。 反对意见:我认为尽管有时它在CPU周期方面效率较低,但我认为它更人性化且易于理解,因为每一行在序列中仅做一件事。在我看来,这就像一条装配线,每个人在他的工作岗位上只能做一份工作。我觉得效率的微不足道的折衷通过代码的关注点得到了很好的补偿。 我在商店里听到的另一个反对FP的论点是,调试起来更困难-是的。跳过Linq代码并不容易。而且我有时确实必须解开方法链,以便更好地关注和剖析我无法立即发现的问题。 _Counter-argument:尽管在大多数情况下我对此没有疑问,因为我认为函数样式在其读取方式以及函数链中引发错误时更具声明性,我通常可以立即发现问题。 我的问题 我一直在尝试在我们的商店中推广实用风格,但我觉得自己没有取得进展。我已经完成了两种编程风格,直到最近才涉足Haskell。尽管有多年的命令性经验,但是现在我在JavaScript中常规使用FP,但在我看来,它已经发展起来。当我将它与如果我坚持命令式风格时可能会做的事情进行比较时,它在我的核心中留下了正确的音符。我已经对功能思维,功能组成进行了重新训练。 我无法理解的是,要说服其他人相信FP的优点是多么困难。 例如,我店里的开发人员确实使用Linq,但是我认为他们通常在处理域数据的上下文中使用它。我在更一般的意义上使用它,并且在我处理序列/列表或持久性数据结构时更喜欢它。我无法说服我的队友扩大对Linq的使用。 我想了解的是导致开发人员不喜欢FP的原因。 我想从一个对FP有丰富经验但决定采用命令式风格的人那里得到一个答案。是什么驱使我们决定必须使用命令而不是使用功能? 这是另一个示例,重点介绍了命令式和函数式编程之间的区别。 我SelectedRows在Linq中这样写了网格的方法: Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Return Me.ugrBase.Selected.Rows. OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)(). Select(Function(ugr) ugr.ListObject). OfType(Of DataRowView)(). Select(Function(drv) drv.Row). ToArray End Get 但是,这种代码风格使我们的一些开发人员感到不舒服,因此我们的领导将其改写为更加熟悉的代码: Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Dim plstRows As …

1
C ++ 11支持高阶列表功能
大多数函数式编程语言(如Common Lisp的,计划/球拍,Clojure中,Haskell中,斯卡拉,ocaml的,SML)支持列出了一些常见的高阶功能,如map,filter,takeWhile,dropWhile,foldl,foldr(见如Common Lisp的,计划/球拍, Clojure并排参考表,Haskell,Scala,OCaml和SML文档。) C ++ 11是否在列表上具有等效的标准方法或函数?例如,考虑以下Haskell代码段: let xs = [1, 2, 3, 4, 5] let ys = map (\x -> x * x) xs 如何在现代标准C ++中表达第二个表达式? std::list<int> xs = ... // Initialize the list in some way. std::list<int> ys = ??? // How to translate the Haskell expression? 上面提到的其他高阶函数呢? …

5
与构造函数相反的函数的正确术语是什么-从数据类型中解包值?
编辑:我改一下这个问题。显然,我引起了一些混乱,因为我没有意识到在OOP中使用析构函数一词是因为它们完全不同-它是在销毁对象时调用的函数。在函数式编程中,我们(尽量)避免发生可变状态,因此没有这种等效状态。(我在问题中添加了适当的标签。) 相反,我已经看到用于解开值的记录字段(尤其是用于newtypes的单值数据类型)有时称为destructor或deconstructor。例如,让我们(在Haskell中): newtype Wrap = Wrap { unwrap :: Int } 这Wrap是构造函数,unwrap是什么? 问题是: 我们如何unwrap在函数式编程中调用?解构器?破坏者?或其他术语? 并澄清一下,这个/其他术语是否适用于其他功能语言,还是仅在Haskell中使用? 或许,在非功能性语言中,对此是否有通用的术语? 我看过两个词,例如: ...通常,一个人为这些提供聪明的构造函数和析构函数以简化与它们的合作。... 在Haskell Wiki上,或 ...这里的一般主题是融合构造函数- 像...这样的解构函数对 在Haskell Wikibook上(这里的含义可能更笼统),或者 newtype DList a = DL { unDL :: [a] -> [a] } 该unDL功能是我们的解构,从而消除了DL构造。... 在现实世界中的Haskell。

2
是否有通常用于创建大型功能编程应用程序的特定工作流程或设计模式?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我已经探索Clojure已有一段时间了,尽管我没有在任何重要的项目中使用过它。基本上,我对语法和某些惯用法已经很熟悉了。来自OOP的背景,Clojure是我非常关注的第一种功能语言,我自然对功能处理方式不太满意。 也就是说,创建大型功能应用程序时是否存在特定的工作流程或设计模式?我真的很想开始“真正地”使用函数式编程,但是由于我目前的专业知识不足,恐怕会导致史诗般的失败。 “四人帮”是面向OO程序员的标准,但是是否有类似的东西更针对功能范例呢?我发现的大多数资源都具有出色的编程能力,但它们并没有退缩以提供更广泛,更体系结构的外观。

5
函数式程序的可读性
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我对此感到很好奇,因为我在学习任何功能语言之前都回想起它们,我认为它们全都是可怕,可怕,难以理解的。既然我已经知道Haskell和f#,我发现花更少的时间来阅读更少的代码,但是那一点代码的功能远比命令语言中的等效功能要多得多,因此感觉像是纯收益,而且我并不是很极端在功能上练习。 这是我的问题,我不断地从OOP人士那里听到,功能样式非常难以理解。我很好奇是否是这种情况,并且我在自欺欺人,或者如果他们花时间学习一种功能语言,那么整个样式将不再比OOP更难以理解? 是否有人看到过任何证据或轶事,他们以一种或另一种方式频繁地说这句话?如果实际上编写功能的可读性较低,那么我不想继续使用它,但是我真的不知道是否是这种情况。



9
资源,以提高您的递归理解?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我知道什么是递归(当一个patten在其内部重新出现时,通常是一个函数,在有条件的突破后会在其一行上调用自己...对吗?),如果我仔细研究它们,我就能理解递归函数。我的问题是,当我看到新的示例时,最初总是很困惑。如果我看到一个循环,或者一个映射,压缩,嵌套,多态调用等,我仅通过查看就知道发生了什么。当我看到递归代码时,我的思考过程通常是“这是wtf吗?” 其次是“哦,这是递归的”,其次是“如果他们说可以的话,我想它一定有用。” 那么,您在此方面有什么技巧/计划/资源来培养技能吗?递归是一个很奇怪的概念,因此我认为解决它的方法可能同样很奇怪而且很模糊。

4
函数式编程-知道它是否有助于工作前景?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 目前,我使用的主要语言是C#,我对它最满意。但是,我已经开始涉猎F#和Haskell,并且真的很喜欢那些语言。我很乐意随着时间的推移提高我使用这两种语言的技能,因为使用它们对我来说真的很有趣(与Ruby相对,后者被吹捧为“乐趣”,我只是不明白乐趣所在,但是我离题了...)。我的问题针对的是已经招聘/面试过编程职位(初级/中级)的人员:如果您在履历表上看到一种实用的编程语言,是否会影响您对该候选人的看法(无论是正面还是负面)? 我对影响候选人观点的函数编程知识的理解是,因为它可以表明候选人可以适应不同的方法,并采用多维度的方法解决问题,而不是“同样的面向对象的方法”。(这可能是偏离基准的,如果这个假设也成立,请告诉我!)

4
FP和OO正交?
我一次又一次听到,我试图理解和验证FP和OO是正交的。 首先,两个概念正交是什么意思? FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。 他们似乎是相反的。这是否意味着它们是正交的? 像Scala这样的语言可以轻松实现OO和FP两者,这是否会影响这两种方法的正交性?


4
在以“功能”风格进行编程时,您是否在应用程序逻辑中编织了一个应用程序状态?
如何构建具有以下所有功能的系统: 对不可变对象使用纯函数。 只传递给它所需功能的数据,不再传递(即没有大的应用程序状态对象) 避免对函数使用过多的参数。 避免仅出于将参数打包和拆包到函数的目的而构造新对象的方法,只是避免将过多的参数传递给函数。如果我要将多个项目作为一个对象打包到一个函数中,则我希望该对象成为该数据的所有者,而不是临时构造的东西 在我看来,State monad违反了规则2,虽然它并不明显,因为它是通过monad编织而成的。 我觉得我需要以某种方式使用Lenses,但是关于非功能语言的文章很少。 背景 作为练习,我将现有的应用程序之一从面向对象的样式转换为功能样式。我要尝试做的第一件事是尽可能多地利用应用程序的内核。 我听到的一件事是,如何用一种纯函数式的语言来管理“状态”,而我相信这是由State monad完成的,从逻辑上讲,您称一个纯函数为“传递状态”。世界原样”,那么当函数返回时,它会返回给您变化后的世界状态。 为了说明这一点,您可以用一种纯粹的功能性方式来创建“ hello world”的方式有点像,您将程序的屏幕状态传递给程序,然后返回印有“ hello world”状态的屏幕状态。因此,从技术上讲,您要调用一个纯函数,并且没有副作用。 基于此,我遍历了我的应用程序,并且:1.首先将我的所有应用程序状态放入单个全局对象(GameState)中。2.其次,使GameState不可变。您无法更改。如果需要更改,则必须构造一个新的。我通过添加一个复制构造函数来做到这一点,该复制构造函数可以选择接受一个或多个已更改的字段。3.对于每个应用程序,我都将GameState作为参数传递。在函数内,在完成将要执行的操作后,它将创建一个新的GameState并返回它。 我如何拥有纯功能核心,以及外部的循环,该循环将GameState馈入应用程序的主工作流程循环。 我的问题: 现在,我的问题是,GameState有大约15个不同的不可变对象。最低级别的许多功能仅对其中一些对象起作用,例如保持得分。因此,假设我有一个计算得分的函数。今天,GameState传递给此函数,该函数通过使用新分数创建新的GameState来修改分数。 似乎有些错误。该功能不需要完整的GameState。它只需要Score对象。所以我更新了它以传递分数,并仅返回分数。 这似乎很有意义,所以我进一步介绍了其他功能。有些功能需要我从GameState传入2、3或4个参数,但是随着我一直在应用程序的外部核心中使用该模式,我传入了越来越多的应用程序状态。就像在工作流循环的顶部,我将调用一个方法,该方法将调用将调用一个方法的方法,依此类推,一直到计算分数为止。这意味着当前分数会通过所有这些层,只是因为最底层的函数将要计算分数。 所以现在我有了带有数十个参数的函数。我可以将这些参数放入一个对象中以减少参数数量,但是然后我希望该类成为状态应用程序状态的主位置,而不是在调用时简单地构造以避免重复传递的对象输入多个参数,然后解压缩它们。 所以现在我想知道我的问题是否是我的函数嵌套得太深了。这是因为希望具有较小的功能,所以我在一个功能变大时进行重构,然后将其拆分为多个较小的功能。但是这样做会产生更深的层次结构,即使外部函数未直接在这些对象上运行,传递给内部函数的所有内容也都必须传递给外部函数。 似乎只是在避免这种问题的过程中传入了GameState。但是我回到了原来的问题,即向函数传递比函数所需更多的信息。

2
Haskell解决3n + 1问题的方法
这是来自SPOJ的一个简单的编程问题:http : //www.spoj.com/problems/PROBTRES/。 基本上,要求您为i和j之间的数字输出最大的Collat​​z周期。(数字$ n $的Colatz周期是最终从$ n $变为1的步骤数。) 我一直在寻找一种Haskell方法,以比Java或C ++更好的性能来解决问题(以适应允许的运行时限制)。尽管可以记住任何已计算周期的周期长度的简单Java解决方案将起作用,但是我并未成功地将其应用于获得Haskell解决方案的想法。 我已经尝试了Data.Function.Memoize,以及使用这篇文章中的想法的自制日志时间备注技术:https ://stackoverflow.com/questions/3208258/memoization-in-haskell 。不幸的是,记忆实际上使cycle(n)的计算更加缓慢。我认为,放缓的原因来自Haskell方式的开销。(我尝试使用编译的二进制代码运行,而不是进行解释。) 我还怀疑简单地将数字从i迭代到j可能会很昂贵($ i,j \ le10 ^ 6 $)。因此,我甚至尝试使用http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html中的想法为范围查询预先计算所有内容。但是,这仍然会出现“超出时间限制”错误。 您能为此告知一个精巧的竞争性Haskell程序吗?

5
为什么功能程序在编译成功与正确性之间有关联?
自从我第一次使用LINQ以来,我已经趋向于函数式编程已有4年了。最近,我写了一些纯函数式C#代码,并且第一手注意到我所读到的有关函数程序的内容-一旦编译,它们就趋于正确。 我试图指出为什么会这样,但是我没有成功。 一种猜测是,在应用OO主体时,您会拥有一个功能程序中不存在的“抽象层”,并且该抽象层使得在实现错误的情况下对象之间的契约可能正确。 有没有人考虑过这一点,并提出了函数式编程中编译成功与程序正确性之间相关性的根本抽象原因?

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.