Questions tagged «functional-programming»

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

5
纯功能语言如何处理模块化?
我来自于面向对象的背景知识,在该背景知识中我了解到,类已经或至少可以用于构成一层抽象,以便于代码的轻松回收,然后可以将其用于创建对象或用于继承。 例如,我可以拥有一个动物类别,然后从中继承猫和狗,使它们都继承许多相同的特征,然后从那些子类别中,我可以创建可以指定动物品种甚至名称的对象它的。 或者,我可以使用类来指定同一代码的多个实例,这些实例处理或包含略有不同的事物。例如搜索树中的节点或多个不同的数据库连接,而没有。 我最近进入函数式编程领域,因此我开始怀疑: 纯函数式语言如何处理此类问题?也就是说,语言没有任何类和对象的概念。



5
为什么缺点列表与函数式编程相关联?
我注意到,大多数功能语言都使用单链接列表(“ cons”列表)作为其最基本的列表类型。示例包括Common Lisp,Haskell和F#。这与主流语言不同,后者的本地列表类型是数组。 这是为什么? 对于Common Lisp(是动态键入的),我得到的想法是,缺点非常普遍,足以成为列表,树等的基础。这可能是一个微小的原因。 但是,对于静态类型的语言,我找不到很好的推理,甚至可以找到反参数: 功能性风格会促进不变性,因此链表的插入容易程度较弱, 功能风格鼓励不变性,因此也鼓励数据共享。数组比链表更容易“部分”共享, 您也可以对常规数组进行模式匹配,甚至更好(例如,您可以轻松地从右向左折叠), 最重要的是,您可以免费获得随机访问, 并且(一个实际的优势),如果该语言是静态类型的,则可以采用常规的内存布局并从高速缓存中提高速度。 那么为什么偏爱链表?

11
如果我们可以使用Python进行函数式编程,是否需要特定的函数式编程语言?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 使用生成器和lambda,我们可以使用Python进行函数式编程。您也可以使用Ruby实现相同的功能。 所以问题是:为什么我们需要特定的功能编程语言,例如Erlang,Haskell和Scheme?这些特定的功能编程语言提供了什么不同?为什么我们不能只使用Python进行函数式编程?

5
对于哪些常见问题,函数式编程不适合?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 函数式编程是一种声明式范例。FP的优势之一是避免了副作用。据说对于某些问题,FP不太适合。 对于哪些常见问题,函数式编程不适合吗?

3
是否有关于函数式编程概念的规范教程或书籍?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 来自过程/ OO编程的背景,我倾向于以过程的方式编写Scheme程序。我将以一种功能性的方式从头开始学习Scheme或Lisp,从而重新设置程序员的思维。 是否有教程或书籍是事实上的标准,用于描述有关函数式编程概念的最佳实践,设计方法和其他有用信息?那本书使它与众不同吗?

4
函数式编程是否可以替代依赖项注入模式?
我最近读了一本书,名为《用C#进行函数式编程》,我发现函数式编程的不可变和无状态本质可以实现与依赖注入模式相似的结果,并且可能甚至是更好的方法,尤其是在单元测试方面。 如果对这两种方法都有经验的人可以分享他们的思想和经验以回答主要问题,我将不胜感激:函数式编程是否可以替代依赖项注入模式?

5
函数式编程:关于并发和状态的正确想法?
FP支持者声称并发很容易,因为它们的范例避免了可变状态。我不明白 想象一下,我们正在使用FP创建一个多人地下城抓取(类似于Rogue),其中我们强调纯函数和不可变数据结构。我们生成一个由房间,走廊,英雄,怪物和战利品组成的地牢。我们的世界实际上是结构及其相互关系的对象图。随着事物的变化,我们对世界的表示也会进行修改以反映这些变化。我们的英雄杀死一只老鼠,捡起短剑,等等。 对我而言,世界(当前现实)带有这种状态观念,而我却缺少FP如何克服这种状况。当我们的英雄采取行动时,功能会改变世界状况。似乎每个决定(人工智能或人为决定)都需要基于当前的现状。我们在哪里允许并发?我们不能同时有多个进程来修改世界状态,以免一个进程的结果基于某个过期状态。在我看来,所有控制都应在单个控制循环中进行,以便我们始终在处理由当前当前对象图表示的当前状态。 显然,有些情况非常适合并发(例如,在处理状态彼此独立的孤立任务时)。 我没有看到并发在我的示例中如何有用,这可能是问题所在。我可能以某种方式歪曲了这一主张。 有人可以更好地代表这一主张吗?


4
以函数为参数的函数是否还应该以那些函数的参数为​​参数?
我经常发现自己编写的函数看起来像这样,因为它们使我可以轻松地模拟数据访问,并且仍然提供一个接受参数的签名来确定要访问的数据。 public static string GetFormattedRate( Func<string, RateType>> getRate, string rateKey) { var rate = getRate(rateKey); var formattedRate = rate.DollarsPerMonth.ToString("C0"); return formattedRate; } 要么 public static string GetFormattedRate( Func<RateType, string> formatRate, Func<string, RateType>> getRate, string rateKey) { var rate = getRate(rateKey); var formattedRate = formatRate(rate); return formattedRate; } 然后我用它像这样: using FormatterModule; …

4
在功能编程中“记住”值
我已经决定将学习函数式编程的工作推给自己。到目前为止,这是一个爆炸,我已经“看到了光”。不幸的是,我实际上不认识任何可以跳出问题的函数式程序员。介绍堆栈交换。 我正在上网络/软件开发课程,但是我的老师对函数式编程并不熟悉。他对我使用它很好,他只是请我帮助他了解它是如何工作的,以便他可以更好地阅读我的代码。 我认为最好的方法是通过说明一个简单的数学函数,例如将值提高到幂。从理论上讲,我可以使用预先构建的函数轻松地做到这一点,但这会违背示例的目的。 无论如何,我在弄清楚如何保持价值方面有些困难。由于这是函数式编程,因此我无法更改变量。如果我必须对它进行编码,它将看起来像这样: (以下是所有伪代码) f(x,y) { int z = x; for(int i = 0, i < y; i++){ x = x * z; } return x; } 在函数式编程中,我不确定。这是我想出的: f(x,y,z){ if z == 'null', f(x,y,x); else if y > 1, f(x*z,y-1,z); else return x; } 这是正确的吗?z在这两种情况下,我都需要保留一个值,但是我不确定如何在函数编程中执行此操作。从理论上讲,我的工作方式有效,但是我不确定它是否“正确”。有更好的方法吗?

5
实体组件系统体系结构对象是否按定义定向?
按照定义,实体组件系统体系结构是否面向对象?对我来说,这似乎更具程序性或功能性。我的观点是,它不会阻止您以OO语言实现它,但是以坚定的OO方式实现它并不是惯用的。 似乎ECS会将数据(E&C)与行为(S)分开。作为证据: 这个想法是在实体中没有嵌入任何游戏方法。 和: 该组件包含用于特定目的的最少数据集 系统是具有一组具有特定组件的实体的单一目的功能 我认为这不是面向对象的,因为面向对象的很大一部分是将您的数据和行为结合在一起。 作为证据: 相反,面向对象的方法鼓励程序员将数据放置在程序其余部分无法直接访问的位置。而是通过调用专门编写的函数(通常称为方法)来访问数据,这些函数与数据捆绑在一起。 另一方面,ECS似乎只不过是将数据与行为分开。

3
编写代码时,我是否必须考虑编译后的机器代码?
例如,我有以下代码: auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; 后来我多次打电话给我。在asm代码中,我看到了使用lambda进行的外部调用。因此,也许我在元编程中获胜,但在asm调试和性能方面是否会输?我是否应该避免使用现代语言功能,宏和其他元编程方面,以确保性能和调试简便性?

3
Clojure是否具有延续/协程/等?
我开始使用Python进行编程,但对协程和闭包之类的概念确实感到困惑。 现在,我认为我在某种程度上是认识他们的,但是我从来没有感受到过“启蒙”的时刻,所以我选择学习Clojure。我买了斯图尔特·哈洛韦(Stuart Halloway)的书,它很好,但是当我查看索引时,并没有像协程或延续这样的词。我用谷歌搜索,但也没有。 所以,我的问题是: Clojure是否具有连续性或协程来执行诸如ping应答之类的任务而没有堆栈溢出? Python示例(尽管标准Python不支持此对称协程的全功能版本): def ping(): while 1: print "ping" function to switching to pong def pong(): while 1: function to switching to ping print "pong"

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.