Questions tagged «functional-programming»

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

7
函数式编程的论点
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我最近一直在有趣地学习F#(我是VB.NET/C#开发人员),我真的很喜欢它提供的一些功能。从理论上讲是这样。但是我想不出要选择使用F#而不是C#进行编码的方案。有任何想法吗?

4
我应该从Scheme学到什么?
我想知道我可以从Scheme中学习哪些独特的功能来帮助我成为更好的程序员? 我在主流语言方面有很多经验,并且我希望拓宽视野并了解其他语言所缺少的功能方面。我熟悉javascript的闭包,C#的lambda表达式,我想知道我能专注于其他语言中缺少的东西吗?除了Lisp语法外,我觉得到目前为止,我已经用其他语言遇到过。 Scheme / Lisp的独特之处是什么会教给我一些新东西?

2
函数式编程语言是否会带来副作用?
根据Wikipedia 所说,声明性的函数式编程语言禁止副作用。通常,声明式编程会尝试最小化或消除副作用。 同样,根据维基百科,副作用与状态变化有关。因此,从某种意义上说,函数式编程语言实际上消除了副作用,因为它们不保存任何状态。 但是,此外,副作用还有另一个定义。副作用 除了返回值之外,还可以与其调用函数或外界进行交互。例如,特定函数可能会修改全局变量或静态变量,修改其参数之一,引发异常,将数据写入显示或文件,读取数据或调用其他副作用函数。 从这种意义上说,函数式编程语言实际上会带来副作用,因为有无数的函数实例影响它们的外部世界,调用其他函数,引发异常,写入文件等。 那么,最后,函数式编程语言是否允许副作用? 或者,我不明白什么是“副作用”,因此命令式语言允许它们,而声明式语言则不允许。根据以上内容以及所得到的内容,没有一种语言能够消除副作用,因此我可能遗漏了一些有关副作用的信息,或者Wikipedia定义的定义不正确。

1
函数样式如何帮助模拟依赖项?
摘自《 Java Magazine》最近一期对Kent Beck的采访: Binstock:让我们讨论微服务。在我看来,微服务的测试优先会变得复杂,因为某些服务要正常运行就需要大量其他服务。你同意吗? 贝克:上一堂大班或上几堂小班,似乎是一组折衷方案。 Binstock:是的,除了我猜,在这里,您必须使用大量的模拟程序,以便能够建立一个可以测试给定服务的系统。 贝克:我不同意。如果它是命令式样式,则必须使用很多模拟。在一种功能样式中,外部依赖项在调用链中被聚集在一起,那么我认为这不是必需的。我认为您可以从单元测试中获得很多覆盖。 他什么意思?函数样式如何使您摆脱对外部依赖的嘲笑?


5
最佳实践-如果在函数调用周围进行包装,而在函数处于保护状态时添加早退出
我知道这可能是非常特定于用例的,但是我发现自己经常想知道这一点。是否有一般首选的语法。 我不是在问函数中最好的方法是什么,我是在问应该早退还是应该不调用函数。 如果在函数调用周围包装 if (shouldThisRun) { runFunction(); } 具有if(保护)功能 runFunction() { if (!shouldThisRun) return; } 如果多次调用此函数,则后一种选项显然有可能减少代码重复,但是有时在此处添加它会带来错误,因为那样您可能会丢失该函数的单一职责。 这是一个例子 如果我有一个updateStatus()函数,该函数仅更新某些事物的状态。如果状态已更改,我只希望状态更新。我知道代码中状态可能发生变化的地方,也知道其他地方可能发生了变化。 我不确定它是否只是我自己,但是检查此内部函数感觉有点脏,因为我想使该函数尽可能保持纯净-如果我调用它,则希望状态得到更新。但是我无法说出将电话包裹在支票中的几个更好的地方,我知道它可能不会改变。

3
为什么在函数式编程中不鼓励使用赋值运算符或循环?
如果我的函数满足以下两个要求,我相信Sum 返回给定条件下列表项的总和的函数,其中项在给定条件下的评估结果为true,这称为纯函数,不是吗? 1)对于给定的一组i / p,无论何时调用函数,都将返回相同的o / p 2)它没有任何副作用 public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){ int result = 0; foreach(var item in numbers) if(predicate(item)) result += item; return result; } 范例: Sum(x=>x%2==0, new List<int> {1,2,3,4,5...100}); 我之所以问这个问题,是因为我几乎每时每刻都在建议人们避免使用赋值运算符和循环,因为它是命令式编程风格。那么上面的示例在函数编程的上下文中使用循环和赋值运算符会出错吗?

6
如果我的对象是可变的,在函数式编程的上下文中会出什么问题?
我可以看到可变对象与不可变对象(如不可变对象)的好处,消除了由于共享和可写状态而导致的多线程编程中的许多疑难解答问题。相反,可变对象有助于处理对象的身份,而不是每次都创建新的副本,因此特别是对于较大的对象,还可以提高性能和内存使用率。 我想了解的一件事是,在函数式编程的上下文中拥有可变对象可能会出错。像告诉我的要点之一是,以不同顺序调用函数的结果不是确定性的。 我正在寻找一个真正的具体示例,其中很明显在函数编程中使用可变对象会导致什么问题。基本上,如果它不好,那么不管是面向对象还是功能编程范例都不好,对吗? 我相信,在我自己的发言下面,我可以回答这个问题。但是我仍然需要一些例子,以便我能更自然地感受到。 OO通过诸如封装,多态等工具帮助管理依赖性并编写更容易维护的程序。 函数式编程也具有促进可维护代码的动机,但是通过使用样式消除了使用OO工具和技术的需要-我认为其中之一是通过最小化副作用,纯函数等。

2
如何读取功能性JavaScript代码?
我相信我已经学到了JavaScript中的一些/许多/大多数基本的函数式编程基础。但是,我在阅读功能代码(甚至是我编写的代码)时遇到了麻烦,并且想知道是否有人可以给我提供任何可以提供帮助的指针,技巧,最佳实践,术语等。 使用下面的代码。我写了这段代码。它旨在在say {a:1, b:2, c:3, d:3}和之间分配两个对象之间的相似度百分比{a:1, b:1, e:2, f:2, g:3, h:5}。我针对Stack Overflow上的这个问题生成了代码。因为我不确定海报要问的相似度百分比,所以我提供了四种不同的相似度: 在第二个对象中可以找到的第一个对象中键的百分比, 在第二个对象中可以找到的第一个对象中值的百分比,包括重复项, 在第二个对象中可以找到的第一个对象中的值的百分比,不允许重复,并且 在第一个对象中可以找到的第一个对象中{key:value}对的百分比。 我以合理的命令性代码开始,但是很快意识到这是一个非常适合函数式编程的问题。尤其是,我意识到,如果我可以针对上述四种策略中的每一种提取出一个或三个函数,这些策略定义了我要比较的特征类型(例如键或值等),那么我可能会能够将其余的代码减少(请原谅文字的打法)为可重复的单元。要知道,保持干燥。所以我改用函数式编程。我为结果感到非常自豪,我认为它相当优雅,并且我认为自己做得很好。 但是,即使我自己编写了代码并在构造过程中理解了代码的每个部分,当我现在回头看时,我仍然对如何读取任何特定的半行以及如何读取都感到困惑。 “抱怨”任何特定的半行代码实际上在做什么。我发现自己制作了一些易用的箭头,将不同的部分连接起来,这些部分很快就会变成一团意大利面。 因此,谁能告诉我如何以简洁明了的方式“阅读”一些更复杂的代码,这有助于我对正在阅读的内容的理解?我猜最吸引我的部分是连续有几个粗箭头的部分和/或连续有多个括号的部分。同样,在它们的核心处,我最终可以弄清楚逻辑,但是(我希望)有一种更好的方法可以快速,清晰,直接地“接受”一系列功能性JavaScript编程。 随意使用下面的任何代码行,甚至其他示例。但是,如果您需要我的一些初步建议,以下是一些建议。从一个相当简单的开始。在代码的末尾,有一个作为参数传递给函数:obj => key => obj[key]。一个人如何阅读和理解呢?较长的示例是从一开始就提供的一项完整功能:const getXs = (obj, getX) => Object.keys(obj).map(key => getX(obj)(key));。最后map一部分让我特别感兴趣。 请注意,目前我不是在寻找Haskell或符号抽象符号或currying的基础知识等的参考。我要寻找的是英文句子,我可以在看着一行代码时默默地开口。如果您有专门解决此问题的参考书,那很好,但是我也没有在寻找答案,我应该去读一些基础教科书。我已经做到了,我得到了(至少是很大一部分)逻辑。还要注意,我不需要详尽的答案(尽管可以尝试这样的尝试):即使是简短的答案,也提供了一种优雅的方式来读取一行特定的否则麻烦的代码,将不胜感激。 我想这个问题的一部分:灿我甚至线性阅读的功能代码,你就知道,左到右,上到下的?还是被迫在绝对不是线性的代码页上创建意粉般布线的心理图景?而且,如果必须这样做,我们仍然必须阅读代码,那么如何获取线性文本并连接意大利面呢? 任何提示将不胜感激。 const obj1 = { a:1, b:2, c:3, d:3 }; const obj2 = { a:1, …

1
将Redux中的原理应用于OO语言是否有意义?
Redux本质上是函数式编程,这很有意义。当我回到另一个项目中的非JavaScript OOP语言时,我想应用相同的原理,例如单个状态对象,作用于该状态部分的缩减器,用于修改状态的语义动作的业务层。 我的项目是C ++,我想知道尝试在设计应用程序中应用功能化,redux风格的方法是否有意义。对于这个应用程序,性能并不是至关重要,但是可维护性是至关重要的。 这样设计我的应用程序会遇到什么困难? 我应该补充一点,这不是GUI应用程序。再考虑一下,由于在应用程序状态更新中没有直接的视觉效果,因此redux在非GUI应用程序中的优势有所减少。

2
功能语言的二维棋盘游戏的数据结构
我正在用功能编程语言Elixir 创建一个简单的MiniMax实现。因为有很多完美知识的游戏(井字游戏,四连冠,西洋跳棋,国际象棋等),所以此实现可能是为任何这些游戏创建游戏AI的框架。 但是,我面临的一个问题是如何以功能语言正确存储游戏状态。这些游戏主要处理二维游戏板,其中经常执行以下操作: 阅读特定板位的内容 更新特定板位置的内容(返回新的移动可能性时) 考虑连接到当前位置的一个或多个位置的内容(即下一个或上一个水平,垂直或对角线位置) 考虑任何方向上多个连接位置的内容。 考虑整个文件,等级和对角线的内容。 旋转或镜像电路板(以检查对称性,以提供与已经计算出的结果相同的结果)。 大多数功能语言都使用链接列表和元组作为多元素数据结构的基本构建块。但是,这些似乎对这项工作非常不利: 链接列表具有O(n)(线性)查找时间。另外,由于我们无法在板上进行一次扫描来“扫描和更新板”,因此使用列表似乎非常不切实际。 元组具有O(1)(恒定)查找时间。但是,将电路板表示为固定大小的元组将使得很难遍历等级,文件,对角线或其他类型的连续正方形。此外,Elixir和Haskell(这是我所知道的两种功能语言)都缺乏读取元组的第n个元素的语法。这将使得不可能编写适用于任意尺寸电路板的动态解决方案。 Elixir具有内置的Map数据结构(而Haskell具有Data.Map),该结构允许O(log n)(对数)访问元素。现在,我使用一个地图,其中x, y以位置表示键的元组。 这是“可行的”,但是以这种方式滥用地图是错误的,尽管我不知道确切的原因。我正在寻找一种以功能性编程语言存储二维游戏板的更好方法。

3
从另一个函数获取值的函数是否被视为纯函数?
我试图找出一种在没有副作用的情况下处理默认变量值的方法,并且最终得到以下结果: function getDefaultSeparator() { return ':'; } function process(input, separator) { var separator = separator || getDefaultSeparator(); // Use separator in some logic return output; } 默认分隔符将在其他函数中使用,我只想在一个地方定义它。 如果这是一个纯函数,那么与仅使用全局DEFAULT_SEPARATOR常量有什么区别?

3
基于类型的不变量的函数编程答案是什么?
我知道不变性的概念存在于多种编程范例中。例如,循环不变式与OO,功能和过程编程有关。 但是,在OOP中发现的一种非常有用的类型是特定类型数据的不变性。这就是标题中所说的“基于类型的不变式”。例如,一个Fraction类型可能具有numerator和denominator,并且其gcd始终为1(即,分数为简化形式)是不变的。我只能通过某种类型的封装来保证这一点,而不是随意设置其数据。作为回报,我不必检查它是否减少了,因此我可以简化等式检查等算法。 另一方面,如果我只是声明一个Fraction类型而没有通过封装提供此保证,那么我就不能安全地在该类型上编写任何函数(假定分数减少了),因为将来有人可能会提出并添加一种方法掌握未减少的分数。 通常,缺少这种不变性可能导致: 需要在多个位置检查/确保前提条件的更复杂算法 DRY违规,因为这些重复的前提条件表示相同的基础知识(不变性应为真) 必须通过运行时故障而不是编译时保证来强制执行前提条件 所以我的问题是函数编程对这种不变性的回答是什么。是否有实现或多或少相同功能的惯用方式?还是功能编程的某些方面使收益的相关性降低?

1
“通量”与纯函数式反应式编程之间是什么关系?
据我了解,Flux是一种技术,用于单向处理应用程序的数据流,将状态与程序的其余部分隔离在只读的独立“存储区”中,该存储区可以通过侦听来更改其自身的状态。由视图发出并由调度程序调度的“动作”。或者,简而言之-一种控制状态的方法。 如果是正确的话,它与功能反应式编程有何关系?由于FRP对状态有非常强的控制力,因此我想这是实际上解决相同问题的互斥技术。因此,如果使用FRP库(例如Elm),则Flux几乎没有用。它是否正确?

1
数学需要了解Haskell类型系统背后的理论吗?
最近,我对Haskell产生了浓厚的兴趣。 在尝试学习新概念(例如,forall关键字和ST monad)和一般的Haskell的类型系统时,我不断地从类别理论和lambda演算中学习概念。所以,我想知道: 数学的其他哪些分支对于深入了解Haskell的类型系统也很重要? 我可以放弃对这些数学的严格研究,而是专注于某些相关概念吗?(例如,lambda演算中的量词。)如果是,那么哪些概念必不可少? 我希望很快能学到类型和编程语言,但是,请提出您认为合适的其他替代阅读资源。

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.