Questions tagged «functional-programming»

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

2
在具有不可变数据的语言中对双向链接或循环数据结构实施操作的解决方法
我想学习如何在Haskell中制作图并对其执行一些本地操作,但是问题不是特定于Haskell的,我们可以考虑使用双链表来代替图。 问题:用 主要支持和倡导不可变数据结构(Haskell,Clojure等)的语言,惯用或推荐的方式来实现双链表(或其他双链或循环数据结构)及其操作。 ?特别是,如何使用语言正式禁止的就地更新? 我很容易想到,如果对双向链接列表执行某些本地操作(例如,如果插入了一个项目),由于语言的惰性,可能不需要立即复制整个列表。但是,由于列表是双重链接的,因此如果在一个地方进行修改,则旧节点都不能在列表的新版本中使用,因此,迟早需要对它们进行标记,复制和垃圾收集。显然,如果仅使用列表的更新副本,则这些操作是多余的,但是它们会增加与列表大小成比例的“开销”。 这是否意味着对于此类任务,不可变数据根本不合适,并且对可变数据没有“本地”支持的功能性声明语言不如命令式语言那么好?还是有一些棘手的解决方法? 附言:我已经在互联网上找到了一些有关该主题的文章和演示,但是很难追踪它们,而我认为这个问题的答案不应该超过一个段落或者是一个图表...我的意思是,如果有对于此问题,没有“功能性”解决方案,答案可能是“使用C”。如果有一个,那么它有多复杂? 相关问题 “函数式编程中的数据结构”。此处没有讨论我有关使用就地更新而不是效率低下的替代方案的具体问题。 “持久性数据结构的内部变异”。那里的重点似乎是用一种未指定的语言进行的低级实现,而我的问题是关于一种语言(功能语言或其他功能)的正确选择以及功能语言的可能惯用的解决方案。 相关报价 纯粹的函数式编程语言允许非常简洁地表达许多算法,但是在少数算法中,就地可更新状态似乎起着至关重要的作用。对于这些算法,缺乏可更新状态的纯功能语言似乎固有地效率低下([Ponder,McGeer and Ng,1988])。 -约翰·劳伯伯里(John Launchbury)和西蒙·佩顿·琼斯(Simon Peyton Jones),《懒惰的功能状态线程》(1994),还有约翰·劳伯伯里和西蒙·佩顿·琼斯,《哈斯克尔州》(1995)。这些论文ST在Haskell中介绍了Monadic类型构造函数。

2
(基本)SQL查询在语义上是否等同于高阶函数?
SQL基本上是map + fold + filter的特定于域的实例吗? 在我看来,以下SQL: SELECT name FROM fruits WHERE calories < 100 只是以下map + filter + fold操作的语法糖: var fruits = [{id : 1, name: 'orange', calories : 100}, {id : 2, name : 'banana', calories : 150}, {id : 3, name: 'apple', calories : '50'}]; fruits.map(function(fruit) { return …

2
如果您知道参数是可能需要或可能不需要的东西,是否有任何理由不使用Optional作为方法参数?
使用Java 8,我看到了越来越多有关Option / Optional用法的文章。我了解他们试图代表的意思,并且看到许多将它们用作回报的示例。但是我看不到它们在没有默认/可选参数语法的语言中被用作方法/函数参数。 Optional如果您知道该参数是可能需要或不需要的东西,是否有任何理由不用作方法参数?这是我想到的一个示例: Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

3
破坏参考透明度的副作用
Scala中的函数式编程说明了副作用对破坏引用透明性的影响: 副作用,这意味着违反了参照透明性。 我已经阅读了SICP的一部分,其中讨论了使用“替代模型”评估程序。 当我大致了解具有引用透明性(RT)的替换模型时,可以将函数分解为最简单的部分。如果表达式是RT,则可以分解表达式并始终获得相同的结果。 但是,正如以上引用所述,使用副作用可能/将破坏替代模型。 例: val x = foo(50) + bar(10) 如果foo和bar 没有副作用,则执行任一函数将始终将相同结果返回x。但是,如果它们确实有副作用,它们将更改一个变量,该变量会破坏/投入替代模型。 我对这个解释感到满意,但是我并没有完全理解它。 请纠正我,并填写有关破坏RT的副作用的所有漏洞,并讨论对替代模型的影响。


2
维持状态而不分配
我正在学习函数式编程,无法理解如何在不使用分配的情况下实现某些特定方案。以下简单的问题几乎使我感到困惑。 编写一个程序,该程序接收有关给定数据结构更改的事件,并在此数据结构达到特定状态时发出事件。 所以我有一个我要维护的数据结构的副本 datastructure_copy::DataStructure 当事件发生变化时,我会触发事件流: datastructure_changes::Stream Change 我有一个将更改应用于数据结构并返回新副本的函数: apply_change::Change -> DataStructure -> DataStructure 而且我有一个谓词,用于检查数据状态是否已达到所需状态。 is_ready::DataStructure ->Boolean 换句话说,我需要在流上工作的“ reduce”之类的东西。 我知道实现此目标的一种方法是在每次更改到达时重新计算状态,但这似乎不切实际。我在State monad玩了一点,但在我看来,这似乎是为了解决另一个问题。 那么还有另一种方法吗? 请注意,我的问题纯粹是概念性的,对Haskell并不很熟悉。

5
纯功能的解决方案能否像当务之急一样干净?
我在Python中有一个练习,如下所示: 多项式作为系数的元组给出,因此幂由索引确定,例如:(9,7,5)表示9 + 7 * x + 5 * x ^ 2 编写一个函数以计算给定x的值 由于我最近从事函数式编程,所以我写了 def evaluate1(poly, x): coeff = 0 power = 1 return reduce(lambda accu,pair : accu + pair[coeff] * x**pair[power], map(lambda x,y:(x,y), poly, range(len(poly))), 0) 我认为这不可读,所以我写了 def evaluate2(poly, x): power = 0 result = 1 return reduce(lambda accu,coeff …

4
fold中的函数参数的名称是什么
在高阶函数中,fold / reduce函数参数的名称(如果有)是什么? 我正在研究一个Monadic表格处理库,其中的行被折叠以产生简单的分析(例如查找列的最小,最大,平均值)。因此,我正在为fold函数的参数寻找一个合理的名称,并且在ML社区(或Haskell或Common Lisp作为第二和第三候选人)中公认的任何名称都将很有趣。 类似的名称f在fold功能描述中很常见,但是它没有描述性,名词更适合。

2
当我们将计算与副作用分开时,我们将“询问世界”的代码放在哪里?
根据命令查询分离原则,以及使用Clojure演示的“ 数据中的思考”和“ DDD”,应将副作用(修改世界)与计算和决策分开,以便更容易理解和测试这两个部分。 这就留下了一个悬而未决的问题:我们应该把“问世界”放在边界的哪个位置?一方面,从外部系统(例如数据库,扩展服务的API等)请求数据不是参照透明的,因此不应与纯计算和决策代码放在一起。另一方面,将它们从计算部分中分离出来并作为参数传递是有问题的,甚至是不可能的,因为因为我们可能事先不知道可能需要请求哪些数据。

7
如何向您的团队介绍编码的功能风格?
我遇到的情况是,小组中的大多数人都来自面向对象的编程背景,对功能编程的了解很少甚至没有。甚至没有像闭包这样的基础知识。 关于将其介绍给功能编码样式的好方法的任何建议?如果我们针对特定情况采用功能性方法,则可以简化许多编码工作。 我已经给出了一些有关功能和编码范例的介绍。不幸的是,我们没有使用像Haskell这样的适当的函数式编程语言(基本上,遗留代码是C,C ++,Java),因此我们必须使用它们进行任何处理。

3
长参数列表与长状态变量列表
在C ++书中,作者说我们不再需要带有长参数列表的函数,因为大多数参数都可以重构为类中的状态变量。另一方面,一本功能性的编程书说状态变量是有害的,因为它会引起副作用,导致副作用,导致易错和难以并行化代码。我很困惑。代码是否应该通过将其状态变量移到函数参数列表中来避免尽可能多地依赖状态变量?

4
STDOUT及其杂质
我已经阅读了很多有关函数式编程的书籍和文章,但仍然感到羞愧,因为无法确定地理解一些非常基本的概念。 函数式编程的主要思想之一是相同的输入始终应产生相同的输出。因此,按定义,查询数据库或写入文件无法以纯功能样式完成。例如,这就是我们需要monad的原因之一。 问题是-为什么我们认为STDOUT输出不纯?是的,任何文件处理程序都存在风险-我们永远无法确定总是会写入数据。但是STDOUT呢?为什么我们认为它不可靠?评估本身是否更加不可靠?我的意思是,我们总是可以拉动触发器,从而进行中断计算。

3
函数式编程语言是否有更多机会进行编译时间优化?
我正在读《现实世界的函数式编程》一书。它从命令式和功能性编程语言之间的比较开始。它指出了函数式编程中的“值”和“表达式”与命令式编程中的“变量”和“函数”有何不同。通过讨论,我得出了一个想法- 与命令式编程语言相比,函数式编程语言有更多机会进行编译时间优化。 是真的吗

5
如果我决定像Haskell一样编写所有Ruby,可以吗?
鉴于Ruby具有内置的良好列表操作功能-减少,映射,选择,收集等。它具有Procs,Blocks和Lambdas,并且具有良好的迭代支持(该each系列),如果我尝试这样做会是一个错误的设计决定以最纯功能的方式编写我所有的Ruby内容?尤其是对于几乎没有I / O的代码(因此不太明显的副作用)? 我一直在学习Haskell(称为“真正的”黑客语言),并且喜欢它的做事方式-我爱Ruby,但是当更多的Haskell精神融入其中时,它可能会变得更加有趣(嗯,没有露比不是一开始就从它那里学到很多东西吗?) 欢迎提供建设性的指导...

6
我应该选择一种功能编程语言吗?
最近,我更加关注编写代码的方式。在阅读了几本关于设计模式的书(我敢肯定它们的过分执行)之后,我已经将思想大大地转向了封装那些改变的东西。我倾向于注意到我写的接口更少,而代码则更多地面向方法,在这里我喜欢用谓词,动作和其他委托任务将生活融入旧的类中。我倾向于认为通常是更改的动作,因此我将其封装。我什至经常(尽管不总是如此)将接口分解为单个方法,然后我更喜欢使用委托来完成任务,而不是强制客户端代码创建新类。 所以我想它然后打我。我应该进行函数式编程吗? 编辑: 我可能对函数式编程有一个误解。 目前,我选择的语言是C#,并且来自C ++背景。我是一名游戏开发人员,但目前没有工作。 我对建筑充满热情。我的优点是干净,灵活,可重用和可维护的代码。我不知道这些方法是否使我中毒,或者是否更好。我是发烧还是应该继续发烧?我了解这可能是关于“使用正确的工具完成工作”的问题,但是我想听听您的想法。 我应该选择一种功能语言吗?我担心的因素之一是离开Visual Studio的舒适感。

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.