Questions tagged «functional-programming»

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

7
最纯正的函数式编程语言?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我对更好地学习函数式编程感兴趣。为此,看来我应该强迫自己使用最纯净的函数式编程语言。因此,我在这里或多或少地要求根据功能性编程语言的纯度对其进行排序。 在我看来,学习Lisp或Clojure(或Scheme或Scala等)会更加实用,但是就我最近所听到的信息而言,Haskell在向某人教授函数式编程原理方面很难被击败。我还不确定,所以我问你:哪一种是最纯粹的函数式编程语言?如果有几个人争夺最纯粹的函数式编程语言的宏伟标题,那么排序将是很棒的。

4
为什么所有的函数式编程教程都这么数学?
我一直在尝试学习函数式编程,而我发现的大多数教程都将数学作为更复杂的结构(在某些情况下甚至是简单的结构)的示例。为什么是这样?我想可以使用更简单的方法。这使得它很难学习。 背景信息:我已经编写软件已有12年了。我了解一些概念,例如闭包,作为一等公民的功能和泛型。在某些高级水平上,我可能对高阶函数有疑问,但是我想相信我已经掌握了基本知识。Monads在咬我,这时我还没有超越(我敢肯定,最终,因为我坚持不懈)。

1
使用唯一性类型实现安全的并行性
一段时间以来,我一直对唯一性类型感兴趣,以替代纯函数式语言中的monad。不幸的是,这是CS研究的一个深奥领域,有关具有唯一性类型的编程的在线资源非常少。 显而易见,如何将唯一性类型用于实现状态数据结构,例如引用(“框”)和数组,尽管这使我无法理解如何使用它们来实现其他常见的状态数据结构。 例如,可以实现唯一类型的锁定吗?可以使用唯一性类型在线程之间共享可变数据吗?是否可以使用唯一类型来构建同步原语(例如互斥体),或者是否需要传递消息?

2
Lisp宏的典型应用是什么?
我正在尝试学习一些LISP,并且已经阅读了很多有关LISP宏的重要性的信息,因此我想获得一些有关它们的工作经验。 您能否建议一个实际的应用程序领域,使我可以使用宏来解决实际问题,并理解该编程结构的有用性? 注意 这不是通用的下一个问题我应该做什么项目。我有兴趣了解通常通过LISP宏解决哪些类型的问题。例如,它们对实现抽象数据类型有好处吗?为什么将这种构造添加到语言中?它解决了哪些无法通过简单功能解决的问题?

6
可以使用函数式编程来开发完整的企业应用程序吗?
我才刚刚开始学习函数式编程(FP)。我来自一个面向对象的世界,那里的一切都是对象,而且大多数都是可变的。我很难理解功能没有副作用的概念。 如果某些东西是不可变的,那么在FP中如何表示诸如Employee或Person之类的常见对象。 FP可以用于创建完整的企业应用程序吗?

3
是否有关于不同语言对软件质量影响的经验研究?
支持功能性编程语言的人断言,功能性编程使代码推理变得更容易。那些支持静态类型语言的人说,他们的编译器捕获了足够的错误以弥补类型系统的额外复杂性。但是,我在这些主题上阅读的所有内容均基于理性的论据,而不是基于经验数据。 是否有任何关于不同种类的编程语言对缺陷率或其他质量指标产生什么影响的经验研究? (对这个问题的回答似乎表明,没有这样的研究,至少对于动态与静态的辩论没有。)

7
什么是一个好的第一个函数式编程项目?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 8年前关闭。 什么是一个好的第一个函数式编程项目? 我希望在我的单身汉项目中取得圆满成功,并且希望通过功能编程项目来完成它。我们不是在学校学习的,但是我们鼓励我们尝试自己学习新事物,而且我认为学习新的范例不仅对我来说是一种很好的练习,而且对于老师来说也可能是一件有趣的事情。 。 问题是我想提前一点开始我的项目,以利用暑假的机会,更好地理解函数式编程,并熟悉一种语言。 您会说这是一个很好的实践项目,有点挑战,但同时也让我学习了语言,范例等。那么您认为对我的单身汉项目而言,这是一个好项目(更高级的项目)吗? 对于进入函数式编程的最佳语言的建议也将不胜感激。

4
引用透明性对程序员有什么好处?
在编程中,引用透明的好处是什么? RT是功能性和命令性范式之间的主要区别之一,并且功能性范式的倡导者经常将RT用作与命令性范式相比的明显优势。但是,这些拥护者们在他们的所有努力中,从来没有解释过为什么这对我作为程序员来说是有益的。 当然,他们会对它们的“纯”和“优雅”有自己的学术解释,但是它如何使它比不太“纯”的代码更好呢?它对我的日常编程有什么好处? 注意: 这不是“ 什么是参照透明性”的副本。 后者地址的话题是什么是RT的问题,而这个问题解决了它的好处(可能不是那么直观)。

3
代数数据类型可以解决什么问题?
公平的警告,我是函数编程的新手,所以我可能有很多错误的假设。 我一直在学习代数类型。许多功能语言似乎都有它们,它们在与模式匹配一​​起使用时非常有用。但是,他们实际上解决了什么问题?我可以像这样在C#中实现一个看似(排序)的代数类型: public abstract class Option { } public class None : Option { } public class Some<T> : Option { public T Value { get; set; } } var result = GetSomeValue(); if(result is None) { } else { } 但是我认为大多数人都同意这是面向对象编程的混蛋,您永远都不要这样做。那么函数式编程是否只是添加了一种更简洁的语法,从而使这种编程风格看起来不太那么粗拙?我还想念什么?

6
函数式编程会增加问题和解决方案之间的“代表性差距”吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 由于机器语言(例如0110101000110101)计算机语言通常已经演化为更高形式的抽象,因此通常将其应用于问题时更易于理解代码。汇编器是对机器代码的抽象,C是对汇编器的抽象,等等。 面向对象的设计似乎非常擅长于使我们能够根据对象对问题进行建模,例如,可以使用Course类,Student类等对大学课程注册系统的问题进行建模。然后,当我们编写解决方案时在OO语言中,我们有类似的类来承担责任,并且通常对设计特别是模块化代码有帮助。如果我将这个问题交给使用OO方法解决此问题的10个独立团队,通常这10个解决方案将具有与该问题相关的类。当您开始接触这些类的耦合和相互作用时,可能会有很多差异,因此不存在“零代表间隙”之类的问题。 我对函数式编程的经验非常有限(没有实际使用,只有Hello World类型的程序)。我没有看到这样的语言如何像OO语言那样轻松地将FP解决方案映射到问题(具有较小的表示差距)。 我了解FP在并发编程方面的优势。但是我是否缺少某些东西,或者FP是否不是要缩小代表差距(使解决方案更容易理解)? 提出另一种方式是:10个不同团队解决同一现实问题的FP代码有很多共同点吗? 摘自维基百科上的抽象(计算机科学)(重点是我的): 函数式编程语言通常会展示与函数相关的抽象,例如lambda抽象(将术语变成某些变量的函数),高阶函数(参数是函数),括号抽象(将术语变成变量的函数)。 由于[某些]现实世界中的问题很难用这种抽象模型来建模,因此代表性的差距可能会增加。 我看到减小代表性差距的另一种方法是将解决方案元素追溯到问题所在。在0年代和1S IN的机器代码是很难追溯,而Student类是容易追溯。并非所有的OO类都可以轻松地跟踪到问题空间,但是许多类都可以。 FP抽象不是总是需要解释以找出他们要解决的问题空间的哪一部分(除了数学问题)?好的-这方面我很好。在查看了更多示例之后,我将看到FP抽象对于在数据处理中表达的问题的一部分非常清晰。 对相关问题的可接受答案UML可以用于对功能程序进行建模吗?-说“功能程序员在图表中没有太多用处。” 我真的不在乎它是否是UML,但是这使我想知道,如果没有被广泛使用的图,那么FP抽象是否易于理解/交流(假设这个答案是正确的)。同样,我对FP的使用/理解水平是微不足道的,因此我了解不需要简单FP程序的图表。 OO设计具有抽象的功能/类/包级别,每个级别都有封装(访问控制,信息隐藏),这使得管理复杂性变得更加容易。这些是使问题从解决方案回到解决方案的要素。 许多答案都谈到了如何以类似于OO的方式在FP中完成分析和设计,但是到目前为止,没有人引用任何高级信息(保罗引用了一些有趣的东西,但它是低级的)。昨天我做了很多谷歌搜索,发现了一些有趣的讨论。以下摘自Simon Thompson(2004)的“重构功能程序”(重点是我的) 在设计面向对象的系统时,理所当然的是,设计将优先于编程。设计将使用诸如Eclipse之类的工具支持的UML之类的系统编写。入门程序员可能会使用BlueJ之类的系统很好地学习视觉设计方法。FAD:Functional Analysis and Design中报告了类似的函数编程方法的工作,但几乎没有其他工作。可能有许多原因。 现有的功能程序具有不需要设计的规模。许多功能程序都很小,但其他功能程序(例如格拉斯哥Haskell编译器)则很实用。 功能程序直接为应用程序领域建模,因此使设计无关紧要。虽然功能语言提供了各种强大的抽象,但是很难说这些提供了对现实世界建模所需的全部和唯一的抽象。 功能程序是作为一系列不断发展的原型而构建的。 在以上引用的博士学位论文中,概述了使用分析和设计方法(ADM)的好处,而与范式无关。但是有人提出ADM应该与实现范例保持一致。也就是说,OOADM最适合用于OO编程,并且不能很好地应用于诸如FP之类的另一范式。我认为这是一个很好的报价,这就是我所说的代表性差距: 人们可以就哪种范式为软件开发提供最好的支持进行详尽的争论,但是当一个范式停留在从问题描述到实施和交付的单一范式中时,就可以实现最自然,有效和有效的开发包。 以下是FAD提出的一组图表: 功能依赖关系图,提供功能及其在实现中使用的功能; 类型依赖图,为类型提供相同的服务;和, 模块依赖关系图,显示系统模块结构的视图。 FAD论文的第5.1节中有一个案例研究,该系统可以自动生成与足球(足球)联赛有关的数据。这些要求具有100%的功能,例如输入足球结果,产生联赛表,得分表,出勤表,在团队之间转移球员,在新结果后更新数据等。没有记录FAD如何解决非功能性要求除了声明“应该以最低的成本允许使用新功能”之外,几乎无法进行测试。 遗憾的是,除了FAD之外,我没有看到任何针对FP提出的现代建模语言(可视化)参考。UML是另一个范例,因此我们应该忘记这一点。

4
在函数式编程中处理状态问题
我已经从OOP的角度开始学习如何编程(我敢肯定,像我们大多数人一样),但是我已经花了很多时间试图学习如何以函数方式解决问题。我对如何使用FP解决计算问题有很好的了解,但是当涉及到更复杂的问题时,我总是发现自己会转向需要可变的对象。例如,如果我正在编写粒子模拟器,则希望更新具有可变位置的粒子“对象”。使用函数式编程技术通常如何解决固有的“状态”问题?

1
将Scala函数传递给Java 8方法
以下Scala代码可以正常工作,并且可以传递给需要功能的Java方法。有没有更清洁的方法可以做到这一点?这是我的第一遍: val plusOne = new java.util.function.Function[Int,Int] { override def apply(t:Int):Int = t + 1 override def andThen[V](after:function.Function[_ >: Int, _ <: V]): function.Function[Int, V] = ??? override def compose[V](before:function.Function[_ >: V, _ <: Int]): function.Function[V, Int] = ??? } 这是我的第二遍-它使用Java-8 Function接口的通用包装器来简化Scala语法: // Note: Function1 is Scala's functional interface, // Function …

4
持久性如何适合纯功能性语言?
使用命令处理程序处理持久性的模式如何适合于一种纯函数式语言,在这种语言中,我们希望使与IO相关的代码尽可能的薄? 当以面向对象的语言实现域驱动设计时,通常使用命令/处理程序模式执行状态更改。在这种设计中,命令处理程序位于您的域对象之上,并负责无聊的与持久性相关的逻辑,例如使用存储库和发布域事件。处理程序是您域模型的公开面孔;诸如UI之类的应用程序代码在需要更改域对象的状态时会调用处理程序。 C#中的草图: public class DiscardDraftDocumentCommandHandler : CommandHandler<DiscardDraftDocument> { IDraftDocumentRepository _repo; IEventPublisher _publisher; public DiscardDraftCommandHandler(IDraftDocumentRepository repo, IEventPublisher publisher) { _repo = repo; _publisher = publisher; } public override void Handle(DiscardDraftDocument command) { var document = _repo.Get(command.DocumentId); document.Discard(command.UserId); _publisher.Publish(document.NewEvents); } } 该document域对象是负责执行业务规则(如“用户应该有权丢弃文档”或“你不能放弃一个已经被丢弃的文件”),并产生我们需要发布域事件(document.NewEvents会是一个IEnumerable<Event>,并且可能包含一个DocumentDiscarded事件)。 这是一个不错的设计-易于扩展(您可以通过添加新的命令处理程序来添加新用例,而无需更改域模型),并且不知道对象的持久化方式(可以轻松地将NHibernate存储库换成Mongo存储库,或将RabbitMQ发布者替换为EventStore发布者),这使得使用伪造品和模拟进行测试变得容易。它还遵循模型/视图分离-命令处理程序不知道批处理作业,GUI或REST API是否正在使用它。 在Haskell这样的纯功能语言中,您可以大致像这样对命令处理程序进行建模: newtype CommandHandler = CommandHandler {handleCommand :: …


3
最快的功能语言
我最近一直在研究函数式编程,尤其是Haskell和F#,而以前更是如此。经过一番探索之后,我找不到比较杰出的功能语言(Scala,F#等)的基准比较。 考虑到它们是混合语言,我知道这对某些语言(Scala出现)不一定是公平的,但我只想知道哪种语言在哪种操作和总体上胜过哪种语言。

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.