Questions tagged «functional-programming»

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


9
将F#引入大型代码库和工程团队的现实陷阱[关闭]
我是一家软件公司的CTO,该公司拥有大量现有代码库(全部为C#)和相当大的工程团队。我可以看到,使用F#编写代码的某些部分将变得更加容易,从而导致更快的开发时间,更少的错误,更容易的并行实现等,基本上可以为我的团队带来整体生产率的提高。但是,我还可以看到引入F#的一些生产率陷阱,即: 1)每个人都必须学习F#,这并不像从Java转换为C#那样简单。尚未学习F#的团队成员将无法处理代码库的F#部分。 2)截止目前(2010年12月),没有可雇用的F#程序员。在各种软件工程师的简历数据库中搜索“ F#”,少于1%的简历包含关键字。 3)目前(2010年12月)的社区支持较少。您可以在C#中搜索几乎所有问题,并找到已经处理过的人,而F#却不是。第三方工具支持(NUnit,Resharper等)也很粗略。 我意识到这有点Catch-22,也就是说,如果像我这样的人不使用F#,那么社区和工具将永远无法实现,等等。但是,我有一家公司可以经营,但我可以领先但不流血的边缘。 我没有考虑其他陷阱吗?还是有人愿意反驳我提到的陷阱?我认为这是一个重要的讨论,很想在这个公共论坛上听到您的反对意见,这可能对提高行业采用F#起到很大作用。

7
强制性break语句和其他循环检查的功能等效项是什么?
假设我具有以下逻辑。如何在函数式编程中编写它? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } 大多数博客,文章中的示例……我看到的只是解释了一个简单的数学函数“ Sum”的简单例子。但是,我有一个类似于以上用Java编写的逻辑,并且希望将其迁移到Clojure中的功能代码。如果我们无法在FP中执行上述操作,则FP的促销方式不会明确说明这一点。 我知道上面的代码是绝对必要的。编写此程序并非出于将来将其迁移到FP的考虑。

2
Haskell委员会为什么选择monad代表I / O?
该清洁语言使用的独特类型来处理I /在一个单纯的功能设置O操作。为什么Haskell委员会改为使用monads?是否还有其他提议处理该委员会调查但决定反对的状态? 注意:我并不是在寻找Monad与其他形式的计算之间的圣战。让我们仅根据委员会在I / O方面的选择来讨论主题。

12
Scheme与Haskell进行函数式编程简介?
我对使用C和C#编程感到满意,并且将来会探索C ++。我可能对将函数式编程作为一种不同的编程范例进行研究感兴趣。我这样做很有趣,我的工作不涉及计算机编程,并且在大学的计算机科学课程中就很早就开始使用函数式编程,这在某种程度上受到了启发。Lambda微积分当然超出了我的数学能力,但是我认为我可以处理函数式编程。 Haskell或Scheme中的哪一个可以很好地介绍函数式编程?我将emacs用作文本编辑器,并希望将来能够更轻松地对其进行配置,这需要学习Emacs Lisp。但是,我的理解是Emacs Lisp与Scheme完全不同,并且在功能性方面也更具程序性。 如果我追求Scheme,我可能会使用已经购买的“ The Little Schemer”书(我有限的翻阅对我来说似乎有些不可思议)。或者,如果我追求Haskell,可以使用“向您了解Haskell的伟大成就”。我还将在第9频道上观看Erik Meijer博士的Haskell简介视频。 任何建议,反馈或意见表示赞赏。 谢谢。 PS BTW由于我拥有用于​​C#开发的Visual Studio 2010,因此我也可以使用F#,但是我认为这不是我选择语言的主要标准。


2
“不组成”是什么意思?
我看到很多文本,特别是函数式编程文本,声称某些CS概念“不构成”。例如:锁不组成,单子不组成。 我一直很难找到这句话的确切含义。当我想到组合时,我想到的是函数组合或对象聚合(如“在继承中偏爱组合”),但这似乎并不是人们在这里使用它的意义。 有人可以解释在上述两个示例(即锁和单子)这样的表达式中使用该短语时的含义吗?

6
为什么某些函数式编程语言在函数应用程序中使用空格?
在看过一些用于函数式编程的语言之后,我总是想知道为什么某些fp语言会在功能应用程序(和定义)中使用一个或多个空格字符,而大多数(全部?)命令式/面向对象的语言都在使用括号,这似乎在是更数学的方式。我也认为后者的样式比没有括号的样式更清晰易读。 因此,如果我们有一个函数f(x)=x²,则有两种调用方法: FP: f x 例子: ML,Ocaml,F# 哈斯克尔 LISP,方案(以某种方式) 非FP: f(x) 例子: 几乎所有命令式语言(我知道,请参阅评论/答案) Erlang Scala(也允许单个参数使用“运算符”) “省略”括号的原因是什么?


5
Javascript是一种功能编程语言吗
Javascript是功能语言吗?我知道它有对象,您也可以用它进行OOP,但是它也是一种功能语言,可以这样使用吗? 您知道OOP如何/似乎像编程的下一个演变一样,是否意味着“功能性编程”是下一个发展(注意:这不是提意见的提示,而是基于事实证据的答案的提示,并且本说明是主持人比贡献者更多;))。 我通过示例学习得最好,也许有人可以展示以OOP方式执行相同的任务,然后以功能编程的方式让我自己理解和比较功能编程的作用。 老实说,我并不完全理解“函数式编程”:P因此,将Javascript与函数式编程进行比较可能完全不正确。 用外行人的话来描述函数式编程:仅仅是使用匿名函数进行摘要的好处吗? 还是这样简单?通过简单的方法,OOP是通过对象进行抽象的好处,但是我认为描述OOP有点过于简单。 这是函数式编程的一个很好的例子吗?... Javascript OOP示例: // sum some numbers function Number( v ) { this.val = v; } Number.prototype.add( /*Number*/ n2 ) { this.val += n2.val; } 函数式编程示例: function forEach(array, action) { for (var i = 0; i < array.length; i++) action(array[i]); } function add(array) { …

7
Haskell的类型系统是理解函数式编程的障碍吗?[关闭]
我正在研究Haskell,目的是理解函数式编程,并期望我将应用在其他语言(主要是Groovy,Python,JavaScript)中获得的见解。 我之所以选择Haskell,是因为我有一个印象,那就是它纯粹是功能性的,不会允许任何对状态的依赖。 我没有选择学习Haskell,因为我对导航一个非常严格的类型系统感兴趣。 我的问题是:强类型系统是否是一种极其纯净的功能语言的必要副产品,还是这与Haskell无关的设计选择?

6
闭包是否被视为不纯正的功能风格?
在函数式编程中,闭包是否被视为不纯? 似乎通常可以通过将值直接传递给函数来避免闭包。因此,应尽可能避免关闭? 如果它们是不纯的,并且我正确地指出可以避免使用它们,那么为什么这么多函数式编程语言支持闭包? 纯函数的标准之一是“在给定相同参数值的情况下,该函数始终求值相同结果值”。 假设 f: x -> x + y f(3)不会总是给出相同的结果。f(3)取决于的值y不是的参数f。因此f这不是一个纯粹的功能。 由于所有闭包都依赖于不是参数的值,所以任何闭包怎么可能是纯净的?是的,从理论上讲,封闭值可以是恒定的,但仅通过查看函数本身的源代码就无法知道。 这导致我想到的是,同一功能在一种情况下可能是纯净的,而在另一种情况下是不纯净的。不能总是通过研究其源代码来确定一个函数是否纯净。相反,在进行区分之前,可能必须在调用它时就其环境来考虑它。 我在想这个吗?

1
面向单分配ADT的代码在现代CPU上的性能
可以推论,使用单一分配处理不可变数据具有明显的效果,那就是需要更多的内存,因为您一直在创建新的值(尽管在幕后的编译器会做一些指针技巧来解决这一问题)。 但是,我现在已经听到几次,性能方面的损失被CPU(特别是其内存控制器)可以利用内存未发生突变(这种情况不多)这一事实带来的收益所抵消。 我希望有人可以阐明这是如何做到的(或者如果不是的话)。 在另一篇文章的评论中,有人提到抽象数据类型(ADT)与此有关,这使我更加好奇,ADT如何特别影响CPU处理内存的方式?不过,这是一个问题,主要是我只是对语言的纯洁度如何必然影响CPU及其缓存的性能等感兴趣。


7
函数编程与带类的OOP相比
最近,我对函数式编程的某些概念感兴趣。我已经使用OOP一段时间了。我可以看到如何在OOP中构建一个相当复杂的应用程序。每个对象都会知道该对象执行的操作。还是父母班上的任何事情都可以。因此,我可以简单地告诉Person().speak()别人说话。 但是如何在函数式编程中做类似的事情?我看到函数是头等舱物品。但是该功能只做一件事。我是否可以简单地使用一个say()浮动的方法,并使用等效的Person()参数来调用它,以便使我知道在说些什么呢? 因此,我可以看到简单的事情,在函数式编程中,我将如何做OOP和对象的比较,从而可以模块化和组织代码库? 作为参考,我对OOP的主要经验是Python,PHP和一些C#。我正在查看的具有功能特性的语言是Scala和Haskell。虽然我倾向于Scala。 基本示例(Python): Animal(object): def say(self, what): print(what) Dog(Animal): def say(self, what): super().say('dog barks: {0}'.format(what)) Cat(Animal): def say(self, what): super().say('cat meows: {0}'.format(what)) dog = Dog() cat = Cat() dog.say('ruff') cat.say('purr')

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.