Questions tagged «functional-programming»

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

1
如何在功能编程语言中实现分支定界?
我试图在所有函数f的集合上写一个分支和边界搜索:D-> R,其中域大小很小(| D |〜20),范围更大(| R |〜2 ^ 20 )。最初,我想出了以下解决方案。 (builder (domain range condlist partial-map) (let ((passed? (check condlist partial-map))) (cond ((not passed?) nil) (domain (recur-on-first domain range condlist partial-map '())) (t partial-map)))) (recur-on-first (domain range condlist partial-map ignored) (cond ((null range) nil) (t (let ((first-to-first (builder (cdr domain) (append ignored …

6
函数式编程是面向对象的超集吗?
我做的功能越多,我越觉得它会增加一个额外的抽象层,就像洋葱的层如何一样-都包含了先前的层。 我不知道这是否是真的,所以要脱离我多年使用的OOP原则,谁能解释功能如何准确地描述其中的任何一个:封装,抽象,继承,多态性 我想我们都可以说,是的,它具有通过元组进行封装,或者从技术上讲元组是否可以算作“函数式编程”,还是它们只是该语言的实用程序? 我知道Haskell可以满足“接口”要求,但是再次不确定它的方法是否具有功能性?我猜想函子具有数学基础的事实,您可以说函子是对功能的期望而定的,也许吧? 请详细说明您认为功能是否满足OOP的四项原则。 编辑:我了解功能范式和面向对象范式之间的区别就很好,并且意识到现在有很多多范式语言可以同时做到这两种。我真的只是在寻找关于完全fp(例如纯粹主义者,例如haskell)如何完成所列4项中的任何一项的定义,或者为什么它不能做到其中任何一项的定义。即“可以使用闭包来封装”(或者如果我对此信念有误,请说明原因)。

6
纯函数式编程语言如何在没有赋值语句的情况下进行管理?
在阅读著名的SICP时,我发现作者似乎不太愿意在第3章中向Scheme介绍转让声明。 由于Scheme是我所知的第一门函数式编程语言,令我有些惊讶的是,有些函数式编程语言(当然不是Scheme)可以在没有赋值的情况下完成。 让我们使用本书提供的bank account示例。如果没有赋值语句,该怎么办?如何更改balance变量?我之所以这么问,是因为我知道那里有一些所谓的纯函数式语言,根据图灵完整理论,这也必须做到。 我学习了C,Java,Python,并在我编写的每个程序中大量使用赋值。因此,这确实是一次令人大开眼界的体验。我真的希望有人能简要解释一下这些函数式编程语言中如何避免赋值以及对这些语言有何深远影响(如果有的话)。 上面提到的示例在这里: (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds"))) 这改变了balance通过set!。在我看来,更改类成员非常像类方法balance。 如我所说,我对函数式编程语言并不熟悉,因此,如果我对它们说错了,请随时指出。

9
对于功能性编程,存在哪些合适的网络框架?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我想使用函数式编程进行一些Web编程。对于功能性编程语言,存在哪些不错的网络框架?

2
纯语言中的垃圾回收有何不同?
在像Haskell这样的纯语言中,所有数据都是不可变的,并且无法以任何方式更改现有的数据结构。另外,许多关于不变数据的算法和功能性编程模式本质上会产生大量垃圾(map例如,创建中间列表的链)。 面对纯净性,垃圾收集器会采用哪些策略和技术?在不纯语言的GC中(不是在纯上下文中),什么功能很好?纯语言为GC创建了哪些其他新问题?

5
如何将OO程序重构为功能性程序?
我很难找到有关如何以功能样式编写程序的资源。我可以在网上找到讨论的最高级的话题是使用结构化类型来减少类层次结构。大多数只处理如何使用map / fold / reduce / etc替换命令式循环。 我真正想找到的是深入讨论非平凡程序的OOP实现,其局限性以及如何以功能样式重构它。不仅是算法或数据结构,还有一些具有不同角色和方面的东西-也许是电子游戏。顺便说一句,我确实读过Tomas Petricek撰写的《现实世界的函数编程》,但是我还想要更多。

2
克里斯·冈崎(Chris Okasaki)的1996年论文和1999年的《纯函数数据结构》一书在内容上有什么区别?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我想阅读纯粹的功能数据结构。我很容易找到论文(可以PDF形式免费获得),但也可以找到一本书。因此,我想知道这两个出版物之间的区别(如果有)。

7
一个人在功能语言上应该有不同的评论吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我才刚刚开始函数式编程,我想知道注释我的代码的正确方法。 注释一个简短的函数似乎有点多余,因为名称和签名已经可以告诉您所有您需要知道的内容。注释较大的函数似乎也有些多余,因为它们通常由较小的自描述函数组成。 注释功能程序的正确方法是什么?我应该使用与迭代编程相同的方法吗?

13
您最反对函数式编程的观点是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 函数式编程是最古老的编程范例之一。但是,与更流行的范例相比,它在业界使用不多。但是在学术界已经大大强调了这一点。 您最反对函数式编程的观点是什么?

4
功能样式异常处理
有人告诉我,在函数式编程中,不应抛出和/或观察异常。取而代之的是,应将错误的计算结果视为底值。在Python(或其他不完全鼓励函数式编程的语言)中,只要出现“保持纯净”的错误,就可以返回None(或另一种替代方法,尽管None它严格地不符合定义)。所以必须首先观察到错误,即 def fn(*args): try: ... do something except SomeException: return None 这违反纯洁吗?如果是这样,是否意味着不可能仅用Python处理错误? 更新资料 埃里克·利珀特(Eric Lippert)在他的评论中使我想起了FP中处理异常的另一种方法。尽管我从未在实践中看到过用Python完成的工作,但一年前我学习FP时我还是玩过它。在这里,任何optional装饰函数返回的Optional值对于正常输出以及指定的异常列表都可以为空(未指定的异常仍可以终止执行)。Carry创建一个延迟的评估,其中每个步骤(延迟的函数调用)要么Optional从上一步获取非空输出,然后继续传递,要么通过一个new评估自身Optional。最后,最终值是normal或Empty。此处,该try/except块隐藏在装饰器后面,因此可以将指定的异常视为返回类型签名的一部分。 class Empty: def __repr__(self): return "Empty" class Optional: def __init__(self, value=Empty): self._value = value @property def value(self): return Empty if self.isempty else self._value @property def isempty(self): return isinstance(self._value, BaseException) or self._value is Empty def __bool__(self): …

5
如何在C#中的不可变对象之间建立循环引用?
在下面的代码示例中,我们有一个表示房间的不可变对象的类。北,南,东和西代表进入其他房间的出口。 public sealed class Room { public Room(string name, Room northExit, Room southExit, Room eastExit, Room westExit) { this.Name = name; this.North = northExit; this.South = southExit; this.East = eastExit; this.West = westExit; } public string Name { get; } public Room North { get; } public Room South { …

5
性能:JavaScript中的递归与迭代
我最近阅读了一些有关Javascript的功能方面以及Scheme与Javascript之间关系的文章(例如http://dailyjs.com/2012/09/14/functional-programming/)(后者受前者的影响,是一种功能性语言,而OO方面则继承自Self(一种基于原型的语言)。 但是我的问题更具体:我想知道是否有关于Java递归与迭代性能的指标。 我知道在某些语言中(通过设计迭代执行得更好),差异很小,因为解释器/编译器将递归转换为迭代,但是我猜可能不是Javascript的情况,因为它至少部分是功能语言。


6
在函数式编程中,没有副作用的局部可变变量是否仍被视为“不良习惯”?
在一个仅在内部使用的函数中具有可变的局部变量(例如,该函数没有副作用,至少不是故意的)是否仍被视为“非函数”? 例如,在“使用Scala进行功能编程”课程样式检查中,将任何var用法视为错误 我的问题是,如果函数没有副作用,是否仍然不鼓励编写命令式代码? 例如,如果不更改输入,而不是对累加器模式使用尾递归,那么执行局部for循环并创建局部可变ListBuffer并将其添加到本地怎么了? 如果答案是“是的,即使没有副作用,也总是劝阻他们”,那是什么原因呢?

5
面向对象的编程范式由于反模块化和反并行性而过时了吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我已经读过CMU教授罗伯特·哈珀(Robert Harper)发表的有争议的文章《向新生学习FP》。他声称CMU将不再在入门课程中教授面向对象的编程,因为它“不适合现代CS课程”。 他声称: 面向对象的编程从入门课程中就完全消除了,因为它的本质是反模块化的和反并行的。 为什么将OOP视为反模块化和反并行的?

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.