Closed. This question needs to be more focused。它当前不接受答案。












想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。

3年前关闭。



Improve this question




我对函数式编程世界还很陌生。尝试使用Java 8附带的新函数式编程。最近,我逐渐了解了currying和方法组成。了解使用Java进行功能样式编程的真正实质非常困难,现在我有两个问题,但是,在提出所有这些问题之前,我已经在python上尝试了相同的方法,现在对一些核心概念已经有点熟悉。

1.在java中,Currying和方法组成有何不同实际上,我一点也没有看到任何区别,尤其是在阅读了这篇文章之后

2.作为一个编程语言(从我的Java编程角度来看),我为什么更喜欢使用curring。例如为什么我要这样做
f(x){ return g(y) }代替f(x,y){ return x(y)}有什么区别?

最佳答案

虽然这两个操作都输出一个函数,但是该示例使区别非常清楚:

  • Currying使用单个函数f()并生成一个“中间”函数f'(),该函数与f()相同,但某些参数已经固定。当您最终填写其余参数时,将评估原始的f()
  • 而组合将采用两个函数f()g(),并创建一个完全不同的函数g(f())

  • 举一个简单的例子:f(x,y) = x+y,其中xy是整数。该函数的数量和组合的使用都不会导致该函数返回非整数结果。但是用g(x) = x/2组成它,您会得到g(f(x,y)) = (x+y)/2,它当然会很高兴地返回非整数。

    为什么要使用currying?

    例如,Java实例方法是相当相似的过程的结果。实例方法与静态方法的不同之处在于它们具有一个额外的隐藏参数this。说new Foo()时,实际上是将此隐藏参数绑定(bind)到新创建的Foo对象。因此,不必调用函数void bar(Foo this, int x),您只需将其称为void bar(int x)即可,并且第一个参数已经固定。 (顺便说一下,void bar(Foo this, int x)实际上是完全有效的Java语法,我们几乎从未使用过它。)

    这并非完全是巧合,因为纯函数语言只能具有其输出仅取决于其输入的函数(与OO语言相反,在OO语言中,方法的输出也可能取决于该方法所属的对象的内部状态) )

    作为一般建议,如果您想学习函数式编程的精髓,最好不要使用Java。甚至也不来自Scala。尝试从像Haskell这样的纯函数式语言中学习它,然后您可以回到Java并更好地了解在其中实现了FP的哪些子集以及如何实现。

    关于Java 8函数样式编程currying和函数组合有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45398362/

    10-10 00:54
    查看更多