Questions tagged «functional-programming»

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

10
数据库和函数式编程是否不一致?
我已经从事Web开发已有一段时间了,最​​近开始学习一些函数式编程。像其他人一样,我在将许多这些概念应用于我的专业工作时遇到了很大的麻烦。对我来说,主要原因是我发现FP保持无状态的目标之间存在矛盾,这与我所做的大多数Web开发工作都与数据高度依赖的数据库紧密相关这一事实很不相符。 使我成为OOP方面更具生产力的开发人员的一件事是发现了对象关系映射器,例如用于.Net的MyGeneration d00dads,用于perl的Class :: DBI,用于ruby的ActiveRecord等。这使我远离了从整天编写插入和选择语句开始,并专注于轻松地将数据作为对象使用。当然,当需要使用SQL查询时,我仍然可以编写它们,但是在后台可以很好地抽象它。 现在,转向函数式编程,对于许多FP Web框架(如Links)来说,似乎需要编写许多样板sql代码,如本例所示。Weblocks似乎更好一些,但是它似乎使用了一种OOP模型来处理数据,并且仍然需要为数据库中的每个表手动编写代码,如本例所示。我想您使用了一些代码生成来编写这些映射函数,但是看起来绝对像是非lisp。 (请注意,我没有非常仔细地查看Weblocks或Links,可能只是误解了它们的用法)。 所以问题是,对于Web应用程序的数据库访问部分(我认为这是相当大的),或其他需要与sql数据库进行接口的开发,我们似乎被迫遵循以下路径之一: 不要使用函数式编程 以一种烦人,轻松的方式访问数据,其中涉及手动编写许多SQL或类似SQL的代码ala链接 将我们的函数式语言强制为伪OOP范式,从而消除了真正的函数式编程的某些优雅和稳定性。 显然,这些选择都不是理想的。是否找到了规避这些问题的方法?这里真的有一个问题吗? 注意:我个人最熟悉FP方面的LISP,因此,如果您要提供任何示例并了解多种FP语言,则Lisp可能是首选语言 PS:对于特定于Web开发其他方面的问题,请参见此问题。

16
Haskell入门指南?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我一直在寻找关于Haskell的不错的指南,但是却找不到一个足够有趣的指南来阅读和/或理解。 几年前,我曾接触过Haskell,但对此我记不清了。我记得当我终于得到它的时候,“ Aha!”的感觉真是不可思议,而且玩起来真的很有趣,所以我希望重新发现Haskell丢失的艺术。 我对Ruby及其功能编程技巧很熟悉,所以我认为我并不完全是黑暗。有链接吗?

4
折叠和缩小之间的区别?
尝试学习F#,但在区分折叠和缩小时感到困惑。折叠似乎做同样的事情,但是需要一个额外的参数。是否存在这两个功能存在的正当理由,或者它们存在以容纳不同背景的人?(例如:字符串和C#中的字符串) 这是从样本复制的代码片段: let sumAList list = List.reduce (fun acc elem -> acc + elem) list let sumAFoldingList list = List.fold (fun acc elem -> acc + elem) 0 list printfn "Are these two the same? %A " (sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])


10
这是一个纯函数吗?
大多数源将纯函数定义为具有以下两个属性: 对于相同的参数,其返回值相同。 其评估没有副作用。 这是与我有关的第一个条件。在大多数情况下,很容易判断。考虑以下JavaScript函数(如本文所示) 纯: const add = (x, y) => x + y; add(2, 4); // 6 不纯: let x = 2; const add = (y) => { return x += y; }; add(4); // x === 6 (the first time) add(4); // x === 10 (the second time) …

9
函数式编程中的“ pythonic”等同于“ fold”函数是什么?
在Haskell中,实现以下目标的最惯用的方法是: foldl (+) 0 [1,2,3,4,5] --> 15 或等效的Ruby: [1,2,3,4,5].inject(0) {|m,x| m + x} #> 15 显然,Python提供了reduce与fold完全相同的功能,但实际上是如上所述的fold的实现,但是,有人告诉我,“ pythonic”编程方式是避免使用lambda术语和高阶函数,并尽可能使用列表理解。因此,有没有一种首选的方式来折叠列表或不是Python reduce函数的类似列表的结构,或者是reduce惯用的方式来实现此目的?

9
真正了解程序和功能之间的区别
我真的很难理解过程式和函数式编程范式之间的区别。 这是Wikipedia条目中有关函数式编程的前两段: 在计算机科学中,函数式编程是一种编程范例,将计算视为对数学函数的评估,并避免了状态和可变数据。与强调状态变化的命令式编程风格相反,它强调函数的应用。函数式编程起源于lambda演算,lambda演算是1930年代开发的用于研究函数定义,函数应用程序和递归的正式系统。许多函数式编程语言可以看作是lambda演算的精妙之处。 实际上,数学函数和命令式编程中使用的“函数”概念之间的区别在于命令式函数可能会产生副作用,从而改变程序状态的值。因此,它们缺乏参照透明性,即,相同的语言表达可能会在不同时间根据执行程序的状态产生不同的值。相反,在功能代码中,函数的输出值仅取决于输入到该函数的参数,因此f两次调用 具有相同参数值的函数x会产生相同的结果f(x)两次。消除副作用可以使理解和预测程序的行为变得更加容易,这是开发函数式编程的主要动机之一。 在第2段中, 相反,在功能代码中,函数的输出值仅取决于输入到函数的参数,因此f两次调用具有相同参数值的函数x会产生相同的结果f(x)。 程序编程不是完全一样吗? 在程序与功能上脱颖而出应该寻找什么?

1
了解为什么拉链是Comonad
这是对上一个问题的回答的后续步骤。 假设我需要映射每个项目a:A的List[A]来b:B使用功能def f(a:A, leftNeighbors:List[A]): B和产生List[B]。 显然,我不能只调用map列表,而可以使用列表拉链。拉链是用于在列表中移动的光标。它提供对当前元素(focus)及其相邻元素的访问。 现在,我可以将替换f为 def f'(z:Zipper[A]):B = f(z.focus, z.left)并将该新函数传递f'给的cobind方法Zipper[A]。 这样的cobind工作:先f'用拉链调用,然后移动拉链,f'再用新的 “移动”拉链调用,再移动拉链,依此类推,依此类推,直到拉链到达列表的末尾。 最后,cobind返回一个类型为的新拉链Zipper[B],可以将其转换为列表,从而解决了问题。 现在请注意和之间的对称性cobind[A](f:Zipper[A] => B):Zipper[B],bind[A](f:A => List[B]):List[B]这就是为什么Lista Monad和Zipperis a 的原因Comonad。 是否有意义 ?

30
JavaScript中多个数组的笛卡尔积
Наэтотвопросестьответына 堆栈溢出нарусском:Декартовопроизведениенесколькихмассивов 您将如何在JavaScript中实现多个数组的笛卡尔积? 举个例子, cartesian([1, 2], [10, 20], [100, 200, 300]) 应该回来 [ [1, 10, 100], [1, 10, 200], [1, 10, 300], [2, 10, 100], [2, 10, 200] ... ]


17
Haskell有什么大惊小怪的?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我认识一些程序员,他们在一起时总是在谈论Haskell,因此在这里每个人似乎都喜欢这种语言。擅长Haskell似乎有点天才程序员的特点。 有人可以举一些Haskell的例子来说明为什么它如此优雅/优越吗?

7
F#开发和单元测试?
我刚开始使用F#,这是我的第一门功能语言。我一直在与C#进行半排他性的合作,并且非常喜欢F#如何使我重新思考如何编写代码。我发现一个令人迷惑的方面是编写代码过程中的变化。我已经在C#中使用TDD多年了,非常感谢进行单元测试以了解我的位置。 到目前为止,我使用F#的过程是编写一些函数,并在交互式控制台中使用它们,直到我“合理”地确定它们可以工作,然后进行调整和组合。这对于诸如Euler Project之类的小规模问题非常有效,但我无法想象以这种方式构建大型项目。 人们如何进行单元测试并为F#程序构建测试套件?是否有与TDD相当的产品?任何指针或想法表示赞赏。

5
功能设计模式
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 4年前关闭。 改善这个问题 有很多功能性习语:m​​onad,applicatives,arguments等。它们在不同的文章中都有记录,但不幸的是,我不知道任何本书或文章在一个地方对其进行了总结(有Typeclassopedia,但它有很多覆盖率不高的区域)。任何人都可以推荐一篇文章/书,该书/书在一个地方就可以很好地覆盖它们,并且对FP具有中级技能的程序员可以访问吗?

6
序列的Python“枚举”的ES6等效项是什么?
Python具有内置函数enumerate,以获取可迭代的(index, item)对。 ES6是否具有等效的数组?它是什么? def elements_with_index(elements): modified_elements = [] for i, element in enumerate(elements): modified_elements.append("%d:%s" % (i, element)) return modified_elements print(elements_with_index(["a","b"])) #['0:a', '1:b'] 等效于ES6,但不包含enumerate: function elements_with_index(elements){ return elements.map(element => elements.indexOf(element) + ':' + element); } console.log(elements_with_index(['a','b'])) //[ '0:a', '1:b' ]

6
如何在现实世界中使用函数式编程?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 改善这个问题 函数式语言之所以不错,是因为它们可以通过消除状态来避免错误,而且还可以为您轻松地自动并行化它们,而不必担心线程数。 但是,作为Win32开发人员,我可以对应用程序的某些dll使用Haskell吗?如果我愿意,有没有真正的优势会自动带给我?如果是这样,那么给我带来这个好处的是编译器? F#是否会并行化您跨多个内核编写的函数,并自动为您自动执行cpu?您会看到任务管理器中的线程数增加吗? 基本上,我的问题是,我如何才能以一种实用的方式开始使用Haskell,如果这样做我会真的看到一些好处吗?

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.