Questions tagged «functional-programming»

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

4
单元测试静态类型的功能代码
我想问大家,在这种情况下,对以Haskell,scala,ocaml,nemerle,f#或haXe编写的静态类型的功能代码进行单元测试是有意义的(最后一个是我真正感兴趣的,但是我想利用更大社区的知识)。 我问这是因为,根据我的理解: 单元测试的一方面是使规范具有可运行的形式。但是,当采用声明性样式将规范化规范直接映射到语言语义时,实际上是否有可能以可运行的形式以独立方式表达规范,从而增加价值? 单元测试最明显的方面是跟踪无法通过静态分析发现的错误。鉴于类型安全的功能代码是一种非常接近静态分析器所理解的代码的好工具,因此您似乎可以将很多安全性转移到静态分析上。但是,无法涵盖代码中使用x而不是y(都为坐标)之类的简单错误。OTOH在编写测试代码时也可能会出现这样的错误,因此我不确定是否值得这样做。 单元测试确实引入了冗余,这意味着当需求改变时,实现它们的代码和涉及该代码的测试都必须被改变。当然,这种开销大约是恒定的,因此可以说,这并不重要。实际上,在像Ruby这样的语言中,它的确无法与优势相提并论,但是鉴于静态类型的函数式编程涵盖了许多基础单元测试的目的,因此感觉这是一个不变的开销,可以不付出任何代价就可以减少它。 由此推断,在这种编程风格中,单元测试已经过时了。当然,这样的主张只会导致宗教战争,所以让我将其归结为一个简单的问题: 当您使用这种编程风格时,您在什么程度上使用单元测试以及为什么使用(为什么希望代码获得什么质量)?或者反过来说:您是否有标准,可以用来限定静态分析器覆盖的静态类型功能代码单元,因此不需要单元测试范围?

6
将函数式编程引入您的开发环境[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 这是一个漫长的故事,但我会尽力总结一下。我们是.NET商店,专门为各种不同类型的基金编写软件。例如,我们编写了健康索赔管理软件,养老金管理软件,401(k)软件和一些其他财务类型的东西。 现在,我们进入了一个新领域:衍生工具和定量分析类型的工作,这似乎非常令人兴奋。有人告诉我,在接下来的8到12个月中,这种情况将会下降。 现在,我已经学会了一些函数式编程,主要是通过这本书对各种语言的肤浅了解,但从未真正深入过它。现在,由于我们是.NET商店,所以我认为F#可能是一个不错的选择,因为我们可以潜在地利用某些.NET库和现有知识。 我的问题是,从哪里开始?我现在很难确定我是否应该使用Haskell,Erlang,Scala,F#等。它们似乎都很有趣且有能力,坦率地说,这可能是摆脱依赖Microsoft的好机会。 有人遇到过类似情况吗?如果是这样,那么您在过渡到功能方面的经验是什么?您选择了什么?为什么?我知道这是一个很大的问题,但是我不知道任何正在使用函数方法的开发人员,因此除了不断地谷歌搜索并在最佳函数式语言上到处发现火焰之战之外,我别无选择。

2
美丽的Erlang代码[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 我一直在尝试有关Erlang的知识,而不是我一直在玩的玩具项目。为此,我正在阅读《Erlang编程》以及Armstrong在Software上的一些档案。 我还想阅读一些示例代码(最好是生产代码),这些代码展示了您可以使用Erlang构建的各种东西,而这在其他语言中会非常困难。除了(我假设)Yaws之外,是否有任何公开的美丽的Erlang代码示例可供我阅读以更好地理解该语言并/或查看各种语言构造的惯用用法? 我特别不是在寻找“完成工作”的代码,而是使用有问题的做法或类似“这是您factorial在Erlang中的编写方式”的示例。 同样,任何人都可以推荐学习该语言的任何优秀文献(提到的“ Programming Erlang”除外)吗?出于喜好,您自己曾经学习过一些东西,但是如果有一些社区标准书籍,也可以放进去。

2
嵌入式软件的功能编程
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 昨晚我正在和一个朋友讨论F#和函数式编程,他向我提出了一个有趣的问题。您将如何在功能上嵌入软件?我的意思是,就无状态代码而言,这似乎是很自然的选择,但嵌入式也需要非常节省内存,而我不确定这方面的功能。 关于嵌入功能的语言或软件包有什么建议吗?

1
Free monad和Reactive Extensions如何关联?
我来自C#背景,其中LINQ演变为Rx.NET,但始终对FP感兴趣。在对Monad和F#中的一些辅助项目进行了一些介绍之后,我准备尝试进入下一个级别。 现在,经过来自Scala的人们关于免费monad的几次讨论,以及在Haskell或F#中的多次写作之后,我发现带有用于理解的口译员的语法与IObservable锁链非常相似。 在FRP中,您将根据较小的领域特定块(包括链中的副作用和失败)组成操作定义,并将应用程序建模为一组操作和副作用。在免费monad中,如果我理解正确,您可以通过将操作设为函子,然后使用coyoneda来进行操作。 将针头朝任何一种方法倾斜的两者之间有什么区别?定义服务或程序时的根本区别是什么?

4
Monads解决什么编程问题?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 我读过很多文章来解释什么是单子,如何使用unit和bind工作,其中一些直接陷入类别理论,如此抽象(至少对我而言),使眼睛流血,有些人完全忽略了这些,并触及了奇怪的类比。墨西哥卷饼,盒子和什么不。 经过几周的研究和大量的油炸神经元,(我认为)我了解了Monads的工作原理。但是,还有一件事让我无法理解,实际上很少有文章涉及(IO和状态除外): 为什么? 为什么Monad重要?他们为什么如此重要?他们正在解决什么问题?那些问题只能用Monad来解决吗,或者还有其他方法吗?


5
习惯FP思维的人应该如何阅读命令性代码?
我大约五个月前从大学毕业,并且已经在一家本地初创公司工作了四个月。在大学期间,我独自学习了Haskell,F#等。我们在大学里学过Java,但是我很快就接触了函数式编程,并且花了更多的时间在命令式编程上。结果,我的大脑开始思考功能性思维。我加入的公司使用Python,并且代码非常重要。我很难阅读命令式代码。我无法追踪突变。当“如果……否则……”嵌套的深度超过四个级别时,我将完全失去对代码中所发生情况的跟踪。另外,Python是一种动态语言,因此代码中没有类型。它' 自从我试图理解我们代码库的一部分(据称是“中等复杂”)以来已经有几个星期了,但是到目前为止,我在理解它方面还没有取得任何明显的进展。请向我提供一些实用的技巧,以帮助我理解该代码。提前致谢! 编辑: 也许我还应该提到代码中没有很多注释,而且名称也不是很直观。

5
导出从Haskell获得的知识和技能的最兼容,使用最广泛的生产语言是什么?
我喜欢Haskell,简洁明了。虽然Haskell用于生产软件中,但根据我所见,它并未得到特别广泛的部署。在生产项目方面,最相似且仍被广泛使用的语言是什么,这样我可能会有滚雪球般的机会在行业中使用类似的出色产品? 大量平台上是否也提供了与第一部分相同的语言?如果没有,那么具有广泛平台部署的最佳替代方案是什么?我希望将一种语言放入待办事项清单,而不是庞大的人群或家庭。确凿的证据将是一个加号。

4
功能范式与底层硬件是否过于分散,以至于总体上效率不高?
受到SO中一个问题的启发:https://stackoverflow.com/questions/6623391/how-to-gain-control-of-a-5gb-heap-in-haskell 关于FP的众多优点和缺点可能是一个漫长的辩论,但就目前而言,我想将FP 的范围缩小到现代硬件上FP的主要效率。 论文: 功能范式意味着不变性和无状态性(?),但是我们运行功能性程序的硬件是有状态的有限自动机。将“纯功能”程序转换为“有状态硬件”表示形式后,程序员几乎无法控制,带来了开销(?),并限制了硬件功能(?)的使用。 我在质疑的陈述中是对还是错? 是否可以证明FP确实/不暗示对现代通用计算机体系结构的主要性能损失? 编辑: 正如我已经在回答某些评论时所说的那样,问题不在于实现性能和细节。这与是否存在主要开销有关,在有状态自动机上运行FP可能会带来这些开销。

3
功能编程和文字冒险
这主要是关于FP的理论问题,但是我将以文字冒险(例如老式的Zork)来说明我的观点。我想知道您对如何使用FP建模有状态模拟的意见。 文字冒险似乎真的需要OOP。例如,所有“房间”都是一个Room类的实例,您可以拥有一个基本的Item类和接口,例如Item<Pickable>可以携带的东西等等。 FP中的世界建模的工作原理有所不同,特别是如果您要在一个必须随着游戏的进行而不断变化的世界(对象移动,敌人被击败,得分提高,玩家改变其位置)中实施不变性的情况下。我想象一个World拥有全部的大对象:您可以探索哪些房间,它们如何链接,玩家所携带的东西,触发了哪些杠杆。 我认为一种纯粹的方法是基本上将这个大对象传递给任何函数,然后由它们返回(可以修改)。例如,我有一个moveToRoom获取World并返回World.player.location到新房间的函数,World.rooms[new_room].visited = True依此类推。 即使这是更“正确”的方法,它也似乎在强制执行纯净。根据编程语言的不同,World来回传递可能非常大的对象可能很昂贵。同样,每个功能可能都需要访问任何World对象。例如,一个房间可能是可进入的还是不可进入的,这取决于另一个房间中触发的杠杆,因为它可能被淹没了,但是如果玩家携带救生衣,它仍然可以进入。怪物是否具有侵略性,取决于玩家是否在其他房间杀死了他的堂兄。这意味着该roomCanBeEntered功能需要访问World.player.invetory和World.rooms,describeMonster需要访问World.monsters等等,(基本上,您必须传递整个负载)。在我看来,这确实需要全局变量,即使这只是良好的编程风格,尤其是在FP中。 您将如何解决这个问题?

8
为什么功能语言语法不更接近人类语言?
我对函数式编程感兴趣,因此决定与Haskell面对面。我的头很痛...但是我最终会得到...虽然我有一个好奇心,为什么语法如此神秘(缺少另一个词)? 是否有一个原因为什么它是不是更有表现力,更接近人类语言? 我知道FP擅长对数学概念进行建模,并且借用了一些简洁的表达方式,但它仍然不是数学……这是一种语言。

2
示例代码解释Joe Armstrong的香蕉猴丛林问题[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 乔·阿姆斯特朗(Joe Armstrong)在《工作中的编码员》一书中指出: 我认为缺乏可重用性的是面向对象的语言,而不是功能语言。因为面向对象语言的问题是他们拥有了它们所伴随的所有隐式环境。你想要一个香蕉,但是你得到的是一只大猩猩,抱着香蕉和整个丛林 我在这里不太明白。如果问题出在香蕉上,我们可以将所有逻辑封装在“ getBanana”函数的后面。猴子和丛林在这种情况下是如何参与的。有人可以写一个代码片段来以更容易理解的方式解释问题吗,例如,说明该Banana对象需要Monkeyand Jungle对象才能被启动的事实?

3
是否可以同时具有欺骗和可变参数功能?
我正在考虑在动态类型的函数编程语言中同时提供currying和variadic函数,但是我想知道是否可行。 这是一些伪代码: sum = if @args.empty then 0 else @args.head + sum @args.tail 据说应该总结所有的论点。然后,如果sum本身被视为数字,则结果为0。例如, sum + 1 等于1,假设它+只能对数字起作用。但是,即使sum == 0是真的,sum无论给出多少个参数(因此同时“部分应用”和“变量”),它都将仍然保持其值和功能属性,例如,如果我声明 g = sum 1 2 3 则g等于6,但是,我们仍然可以进一步应用g。例如,g 4 5 == 15是真的。在这种情况下,我们不能用g文字替换对象6,因为尽管它们在被视为整数时会产生相同的值,但它们内部包含不同的代码。 如果将这种设计用于真实的编程语言中,是否会引起任何混淆或歧义?

6
哪些功能特性值得为它们带来的好处感到困惑?
在使用Haskell和F#学习了函数式编程之后,OOP范例似乎在类,接口和对象方面倒退了。我的同事可以理解FP的哪些方面?是否有任何FP风格值得与我的老板谈谈对我的团队进行再培训,以便我们可以使用它们? FP的可能方面: 不变性 部分应用和咖喱 一流的功能(功能指针/功能对象/策略模式) 惰性评估(和Monad) 纯功能(无副作用) 表达式(相对于语句-每行代码都会产生一个值,而不是引起副作用,或者除了引起副作用之外) 递归 模式匹配 它是一种免费的所有人,我们可以在编程语言支持的范围内做任何事情吗?还是有更好的指南?

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.