Questions tagged «functional-programming»

函数式编程是一种基于使用函数构建抽象,避免副作用和状态改变的编程范例。纯函数式编程是线程安全的。

9
函数式编程的好处是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 您认为函数式编程的好处是什么?以及它们如何适用于当今的程序员? 函数式编程和OOP之间的最大区别是什么?

1
工人的组合器说明
什么是组合器? 是“没有自由变量的函数或定义”(在SO上定义)吗? 还是这样呢?据约翰·休斯(John Hughes)在他关于箭头的著名论文中所说,“组合器是从程序片段中构建程序片段的函数”,这是有优势的,因为“ ...使用组合器的程序员构造了许多所需的自动编程,而不是手工编写每个细节”。他继续说map和filter是这样的组合子的两个常见的例子。 一些符合第一个定义的组合器: 小号 ķ ÿ 《嘲笑一只模仿鸟》中的其他人(我可能是错的-我没有读过这本书) 一些符合第二个定义的组合器: 地图 过滤 折叠/减少(大概) >> =,compose,fmap ?????中的任何一个 我对第一个定义不感兴趣-那些定义不会帮助我编写一个真实的程序(如果您确信我错了,则为+1)。 请帮助我理解第二个定义。我认为map,filter和reduce很有用:它们使我可以进行更高级别的编程-错误更少,代码更短,更清晰。以下是一些有关组合器的具体问题: 还有哪些组合器示例,例如地图,过滤器? 编程语言通常实现哪些组合器? 组合器如何帮助我设计更好的API? 如何设计有效的组合器? 与非功能语言(例如Java)中的组合器有什么相似之处,或者这些语言代替组合器使用什么? 更新资料 感谢@CA McCann,现在我对组合器有了更好的了解。但是一个问题仍然是我的症结所在: 使用大量使用组合器编写的功能程序与不使用组合器编写的功能程序有什么区别? 我怀疑答案是,繁重的组合版本更短,更清晰,更通用,但是如果可能的话,我希望进行更深入的讨论。 我还在寻找更多fold常见编程语言中的复杂组合器的示例和解释(即比复杂)。



9
函数式编程语言如何工作?
如果函数式编程语言无法保存任何状态,它们将如何做一些简单的事情,例如从用户那里读取输入内容?他们如何“存储”输入(或存储与此相关的任何数据?) 例如:这个简单的C语言将如何转换为Haskell这样的函数式编程语言? #include<stdio.h> int main() { int no; scanf("%d",&no); return 0; } (我的问题受到了这篇出色的文章的启发:“名词的王国中的执行”。阅读它使我对面向对象的编程到底是什么,Java如何以一种极端的方式实现它以及函数式编程语言如何成为一种更好的理解。对比。)

10
我可以在Scala中将两个以上的列表一起压缩吗?
给出以下Scala列表: val l = List(List("a1", "b1", "c1"), List("a2", "b2", "c2"), List("a3", "b3", "c3")) 我怎样才能得到: List(("a1", "a2", "a3"), ("b1", "b2", "b3"), ("c1", "c2", "c3")) 由于zip只能用于合并两个列表,因此我认为您需要以某种方式迭代/减少主列表。毫不奇怪,以下方法不起作用: scala> l reduceLeft ((a, b) => a zip b) <console>:6: error: type mismatch; found : List[(String, String)] required: List[String] l reduceLeft ((a, b) => a zip …

8
函数语言(特别是Erlang)如何/为什么很好地缩放?
一段时间以来,我一直在关注功能编程语言和功能的日益普及。我调查了他们,却没有看到上诉的原因。 然后,最近我在Codemash上参加了Kevin Smith的“ Erlang基础”演讲。 我享受了演示,并了解到函数式编程的许多属性使避免线程/并发问题变得更加容易。我知道状态和可变性的缺乏使多个线程无法更改同一数据,但是Kevin表示(如果我理解正确的话),所有通信都是通过消息进行的,消息是同步处理的(再次避免了并发问题)。 但是我读过Erlang用于高度可扩展的应用程序(这是爱立信首先创建它的全部原因)。如果将所有内容都作为同步处理的消息来处理,那么如何高效地每秒处理数千个请求?这不是为什么我们开始转向异步处理-这样我们才能利用同时运行多个操作线程并实现可伸缩性的优势吗?看起来这种体系结构虽然更安全,但在可伸缩性方面却倒退了一步。我想念什么? 我了解Erlang的创建者有意避免支持线程以避免并发问题,但是我认为多线程是实现可伸缩性所必需的。 函数式编程语言如何才能固有地具有线程安全性,又可以扩展?

5
Ruby是否执行尾部调用优化?
函数式语言导致使用递归来解决许多问题,因此许多函数式语言执行尾部调用优化(TCO)。TCO导致从另一个函数(或其本身,在这种情况下也称为“尾递归消除”,它是TCO的子集)对该函数的调用,作为该函数的最后一步,不需要新的堆栈框架,这减少了开销和内存使用。 Ruby显然从功能语言(lambda,地图等功能)中“借用”了许多概念,这使我感到好奇:Ruby是否执行尾部调用优化?

5
从数组流传输时,为什么不能将整数映射到字符串?
这段代码有效(取自Javadoc): List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", ")); 这是无法编译的: int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers) .map((Integer i) -> i.toString()) .collect(Collectors.joining(", ")); IDEA告诉我,“ lambda表达式中的返回类型字符串不兼容”。 为什么呢 以及如何解决?


5
实现类型推断
我在这里看到了一些有关静态类型与动态类型的有趣讨论。由于编译类型检查,更好的文档代码等,我通常更喜欢静态类型。但是,我同意,例如,如果采用Java的方式完成代码,它们会使代码混乱。 因此,我将开始构建自己的功能样式语言,而类型推断是我要实现的事情之一。我确实知道这是一个很大的主题,并且我不尝试创建以前没有做过的事情,只是进行基本推理... 关于如何阅读的任何指示都可以帮助我解决这个问题?最好是一些比较实用/实用的东西,而不是更多的理论范畴论/类型理论课本。如果那里有一个实施讨论文本,以及数据结构/算法,那将是很可爱的。

1
如何压缩列表中的列表
我想压缩以下列表列表: >>> zip([[1,2], [3,4], [5,6]]) [[1,3,5], [2,4,6]] zip仅当列表分为多个单独的组件时,才可以使用当前实现来实现: >>> zip([1,2], [3,4], [5,6]) (1, 3, 5), (2, 4, 6)] 无法弄清楚如何拆分列表并将各个元素传递给zip。优选功能性解决方案。

15
用Haskell编写Haskell解释器
一个经典的编程练习是用Lisp / Scheme编写Lisp / Scheme解释器。可以利用完整语言的功能为该语言的子集生成解释器。 Haskell有类似的练习吗?我想使用Haskell作为引擎来实现Haskell的子集。当然可以做到,但是有没有在线资源可供参考? 这是背景故事。 我正在探索使用Haskell作为语言来探索我正在教授的“ 离散结构”课程中的某些概念的想法。在本学期,我选择了米兰达语,这是一种较小的语言,启发了Haskell。Miranda完成了大约90%的工作,但是Haskell完成了大约2000%的工作。:) 所以我的想法是创建一种语言,该语言具有我想要的Haskell的功能,而不允许其他所有功能。随着学生的进步,一旦他们掌握了基础知识,我就可以有选择地“打开”各种功能。 教学“语言水平”已成功用于教授Java和Scheme。通过限制他们可以做的事情,可以防止他们在他们仍在掌握要教的语法和概念的同时向自己开枪。并且您可以提供更好的错误消息。

3
当前的功能性反应式编程实现的状态如何?
我正在尝试可视化Haskell中的一些简单的自动物理系统(如摆锤,机器人手臂等)。通常,这些系统可用方程式来描述 df/dt = c*f(t) + u(t) 其中u(t)代表某种“智能控制”。这些系统看起来非常适合于功能性反应式编程范例。 因此,我抓住了保罗·休达(Paul Hudak)的著作《 The Haskell School of Expression》,发现那里展示的领域特定语言“ FAL”(用于功能动画语言)实际上对我的简单玩具系统非常满意(尽管有些功能值得注意integrate,似乎对于有效使用而言有点懒惰,但很容易修复)。 我的问题是,对于当今更高级甚至是实际的应用程序,最成熟,最新,维护良好,性能调整的替代方案是什么? 该Wiki页面列出了Haskell的几个选项,但是我不清楚以下方面: Conal Eliott的项目(据我所知)是这种编程范例的发明者之一,它的“反应性”状态看起来有些陈旧。我喜欢他的代码,但也许我应该尝试其他更多的替代方法?就语法/性能/运行时稳定性而言,它们之间的主要区别是什么? 引用2011年的一项调查的第6节,“ ... FRP实施在性能上仍然不够有效或可预测,无法在需要延迟保证的域中有效使用... ”。尽管该调查建议了一些有趣的可能的优化方法,但考虑到FRP已经存在了15年以上,我给人的印象是,至少在几年内,此性能问题可能非常或什至固有地很难解决。这是真的? 调查的同一位作者在他的博客中谈论“时间泄漏” 。问题是FRP特有的,还是使用纯非严格语言进行编程时通常遇到的问题?您是否发现过长时间稳定基于FRP的系统太难了吗? 这仍然是研究水平的项目吗?诸如工厂工程师,机器人工程师,财务工程师等人员实际上是否正在使用它们(以适合他们需求的任何语言)? 尽管我个人更喜欢Haskell实现,但我愿意接受其他建议。例如,拥有一个Erlang实现会特别有趣---那么拥有一个智能的,自适应的,自学习的服务器进程将非常容易!

6
Javascript中的多态性是什么?
我读过一些我可以在互联网上找到的关于多态的文章。但是我认为我不太了解它的含义及其重要性。大多数文章都没有说明为什么它很重要,以及如何在OOP中实现多态行为(当然是在JavaScript中)。 我无法提供任何代码示例,因为我不知道如何实现它,因此我的问题如下: 它是什么? 我们为什么需要它? 这个怎么运作? 如何在javascript中实现这种多态行为? 我有这个例子。但是很容易理解该代码的结果。它没有对多态性本身给出任何清晰的想法。 function Person(age, weight) { this.age = age; this.weight = weight; this.getInfo = function() { return "I am " + this.age + " years old " + "and weighs " + this.weight +" kilo."; } } function Employee(age, weight, salary) { this.salary = salary; …

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.