Questions tagged «functional-programming»

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


10
程序为什么要使用闭包?
在阅读了许多解释闭包的文章之后,我仍然缺少一个关键概念:为什么要写闭包? 程序员将执行什么样的特定任务,最好通过闭包来完成? Swift中闭包的示例是访问NSUrl并使用反向地址解析器。这是一个这样的例子。不幸的是,这些课程只是关闭。他们没有解释为什么将代码解决方案写为闭包。 一个现实世界中编程问题的示例可能会触发我的大脑说:“啊哈,我应该为此写一个闭包”,这比理论上的讨论要有用得多。该站点上不乏理论讨论。

3
什么是lambda,为什么有用?[关闭]
到目前为止,我听说: λ演算 Lambda程式设计 Lambda表达式 Lambda函数 这似乎都与函数式编程有关... 显然它将被集成到C ++ 1x中,所以我现在可能会更好地理解它: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions 有人可以简短地定义什么是lambda事物,并给出一个有用的地方吗?

6
函数和lambda有什么区别?
我对“功能”和“ lambda”有些困惑。我看过一些例子,它们表明scheme关键字的lambda工作方式与JavaScript关键字非常相似function,但是我真的不知道它们之间的关系。 有人告诉我说.net中的对象时,“功能”和“方法”可以互换使用。我想知道“ lambda”和“ function”是否同样含义相同。看到希腊字母lambda(λ)出现在此站点上的许多化身中,我不知道'lambda'是否具有某些深奥的含义。更让人困惑的是,在.net中,C#的功能部分将传递给另一个函数的函数表达式称为“ lambda表达式”,因此,这个词似乎无处不在。 我对“ lambda演算”一词也很熟悉。 函数和lambda有什么区别?

12
哪种编程语言生成最少的难以发现的错误?[关闭]
您认为哪种语言可使普通程序员输出具有最少数量的难以发现的错误的功能?当然,这是一个非常广泛的问题,我对非常广泛和笼统的答案和智慧感兴趣。 我个人发现我花很少的时间在Java和C#程序中寻找奇怪的错误,而C ++代码具有其独特的重复性错误集,而Python /类似的语言具有其自己的一组常见和愚蠢的错误,编译器可以检测到它们用其他语言。 同样,我发现在这方面很难考虑函数式语言,因为我从未见过用完全函数式代码编写的大型复杂程序。请输入您的意见。 编辑:完全任意地澄清难以发现的错误:花费15分钟以上才能重现,或者花费1小时以上才能找到原因并修复。 如果这是重复的内容,请原谅我,但是在这个特定主题上我什么都没找到。

1
您如何用Haskell或其他功能编程语言设计程序?
我在面向对象的编程语言(例如C#或ruby)方面有一些经验。我知道如何设计面向对象风格的程序,如何创建类和对象,以及如何定义它们之间的关系。我也知道一些设计模式。 人们如何编写功能程序?他们如何开始?有功能语言的设计模式吗?极限编程或敏捷开发等方法是否适用于功能语言?


14
为什么目前对函数式编程充满热情?[关闭]
最近,对于Scala,Clojure和F#,我已经听到了很多有关函数式编程语言的热情。我最近开始学习Haskell,以学习FP范例。 我喜欢它,它真的很有趣,并且适合我的数学背景。 但这真的有关系吗?显然,这并不是一个新主意。 这是我的问题: 是什么促成了最近FP的热情?是对OO仅仅是无聊,还是为了使FP比以前更需要而进行了一些更改? 这是否预示着FP的未来?还是像对象数据库这样的时尚? 换句话说,任何人都可以帮助我了解它的来历和去向吗?

11
“易于推理”-这是什么意思?[关闭]
我听到过很多次其他开发人员使用该短语“宣传”某些模式或开发最佳做法的消息。在大多数情况下,当您谈论函数式编程的好处时,都会使用此短语。 短语“易于推理”按原样使用,没有任何解释或代码示例。因此,对我而言,它就像下一个“嗡嗡声”一词,更多“经验丰富”的开发人员在演讲中使用。 问题:您能否提供一些“不容易推理的”示例,以便将其与“不容易推理的”示例进行比较?

6
Java检查的异常的解决方法
我非常感谢有关lambda和默认方法接口的Java 8新功能。但是,我仍然对检查的异常感到无聊。例如,如果我只想列出对象的所有可见字段,我想简单地写一下: Arrays.asList(p.getClass().getFields()).forEach( f -> System.out.println(f.get(p)) ); 但是,由于该get方法可能会抛出一个与Consumer接口协定不同的已检查异常,所以我必须捕获该异常并编写以下代码: Arrays.asList(p.getClass().getFields()).forEach( f -> { try { System.out.println(f.get(p)); } catch (IllegalArgumentException | IllegalAccessException ex) { throw new RuntimeException(ex); } } ); 但是,在大多数情况下,我只希望将异常作为a抛出,RuntimeException并让程序处理或不处理没有编译错误的异常。 因此,我想就我对有争议的异常进行检查的方法发表您的看法。为此,我创建了一个辅助接口ConsumerCheckException<T>和一个实用程序功能rethrow(根据Doval的评论进行了更新),如下所示: @FunctionalInterface public interface ConsumerCheckException<T>{ void accept(T elem) throws Exception; } public class Wrappers { public static <T> Consumer<T> rethrow(ConsumerCheckException<T> c) …

6
选择功能性编程语言
最近,我读了很多有关函数式编程语言的主题(实际上,几乎是去年)。我真的很想选一个并彻底学习它。 上学期,我被介绍给Scheme。我爱它。喜欢语法的极端简单性,同调性原则,宏(卫生和非卫生),过程的n个类等。 Scheme的问题在于它是一种学术语言。我认为它不是真正在生产环境中使用的。我也不认为拥有我们的简历特别好。因此,我一直在寻找替代方案。它们很多,而且它们的流行程度似乎都差不多。 我还考虑过一些其他功能语言的想法: Clojure:这听起来很不错,因为它可以访问Java世界,面向可伸缩性和并发性,但是Java世界现在不处于边缘吗?我已经非常了解Java,但是根据JVM添加更多能量是否明智? Haskell:看起来像是一种很受赞赏的语言,但是根据我的阅读,它也更多是一种学术语言。 Lisp:一直存在至今。它似乎具有Scheme所提供的大部分功能。它有一个很大的社区。据我所知,它可能是业界使用最广泛的函数式编程语言。 F#:不是真的考虑过。我不是MS资料的忠实拥护者。我没有钱购买他们的软件(我可以让他们摆脱大学联盟的束缚,但我更倾向于使用社区驱动的解决方案)。虽然...我想这将是最佳的职业导向选择。 今晚,我倾向于Lisp。一周前是Haskell。在此之前是Clojure。在过去的一年中,我在做一些Scheme是为了娱乐,而不是因为您知道的原因而推动它。现在,我想变得认真起来(关于学习一个,关于使用它进行实际的项目,关于也许最终与其进行专业合作)。我的问题是,我需要先深入学习它们,然后才能选择其中的一个。

2
艾伦·凯(Alan Kay)在“ Smalltalk的早期历史”中的“分配”是什么意思?
我一直在阅读《 Smalltalk的早期历史》,并且提到了“分配”,这使我质疑其含义: 尽管OOP来自许多动机,但其中两个是核心。大型方案是为包含细节隐藏的复杂系统找到一种更好的模块方案,而小型方案是找到一种更灵活的分配方案,然后尝试将其彻底消除。 (从1960-66年开始-早期的OOP和六十年代的其他形成性思想,第一部分) 我从Simula得到的是,您现在可以用目标替换绑定和分配。您希望任何程序员做的最后一件事就是内部状态混乱,即使以图形方式呈现也是如此。相反,应该将对象呈现为更适合用作动态组件的更高级别行为的站点。(...)不幸的是,当今所谓的“面向对象程序设计”中的大部分只是带有奇特构造的旧式程序设计。许多程序现在都通过“昂贵的附加程序”来完成“分配样式”操作。 (摘自“面向对象”样式,第IV节) 我将目的解释为对象是外观,而目的是在对象上设置实例变量(即“赋值”)的任何方法(或“消息”)都违反了目的,我是否正确?第四节中的以下两个陈述似乎支持了这种解释: 一起使用的四种技术-持久状态,多态性,实例化和作为目标的方法-占据了很大的力量。这些都不要求使用“面向对象的语言”-ALGOL 68几乎可以转变为这种样式-OOPL只是将设计师的思想集中在一个特定的富有成果的方向上。但是,正确执行封装不仅是对状态抽象的承诺,而且是从编程中消除面向状态的隐喻的承诺。 ...和: 分配语句(甚至是抽象的语句)表达了非常低级的目标,需要更多的目标才能完成任务。通常,我们不希望程序员弄乱状态,无论是否模拟。 可以这样说,鼓励不透明,不可变的实例吗?还是不鼓励直接改变状态?举例来说,如果我有一个BankAccount类,它的确定有GetBalance,Deposit和Withdraw实例方法/消息; 只需确保没有SetBalance实例方法/消息?

3
为什么贫血领域模型在C#/ OOP中被认为是不好的,而在F#/ FP中却非常重要?
在关于F#的博客文章中,它表示乐趣和收益,它表示: 在功能设计中,将行为与数据分开非常重要。数据类型是简单且“哑”的。然后分别有许多作用于这些数据类型的函数。 这与面向对象的设计正好相反,在面向对象的设计中,行为和数据必须结合在一起。毕竟,这正是一个类。实际上,在真正的面向对象设计中,除了行为外,您应该什么都没有-数据是私有的,只能通过方法访问。 实际上,在OOD中,围绕数据类型的行为不足被认为是一件坏事,甚至有一个名字:“ 贫血领域模型 ”。 鉴于在C#中,我们似乎继续从F#借用,并尝试编写更多的函数式代码;为什么我们不借用分离数据/行为的想法,甚至认为它不好呢?仅仅是因为该定义不与OOP一起使用,还是有一个具体的原因在C#中是不好的,由于某些原因在F#中不适用(实际上是相反的)? (注意:我对C#/ F#中的差异特别感兴趣,因为它们可能会改变对优劣的看法,而不是对博客文章中的任一种看法持不同意见的人)。

5
批评IO monad被视为在世界上运作的州monad
IOHaskell中的单子通常被解释为州是世界的州单子。因此,将IO amonad 类型的值视为worldState -> (a, worldState)。 前一段时间,我读了一篇文章(或博客/邮件列表帖子),该文章批评了这种观点,并提出了一些不正确的原因。但是我既不记得这篇文章,也不记得原因。有人知道吗 编辑:这篇文章似乎丢失了,所以让我们在这里开始收集各种参数。 我开始悬赏以使事情变得更有趣。 编辑:该文章中,我一直在寻找的应对尴尬的阵容:单子输入/输出,并发性,异常和外国语言的Haskell中调用由西蒙·佩顿-琼斯。(感谢TacTics的回答。)


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.