关于scala:函数和方法在函数编程方面的区别

Difference between a function and a method in terms of Functional programming

本问题已经有最佳答案,请猛点这里访问。

任何人都能解释函数和方法在函数编程方面的区别吗?

我是以斯卡拉为例来问这个问题的

我们记下了两件事,即一个函数和一个方法,它做同样的事情

方法

定义添加(x:int,y:int):int=x+y

功能

val addfunc:函数1[int,int]=(x,y)=>x+y

我们可以看到它们都做了相同的事情,即2个整数的加法,但是我们用一个函数得到了一些额外的属性。

  • 因为这是一个函数,所以它将被视为第一类对象,如double、float等,可以作为值传递给任何其他函数或方法。

  • 我们可能可以将此函数存储在数据结构中,如alinked list或hashmap

  • 这是一个不变性的完美例子,保持了函数编程世界的引用透明性,也就是说,我可以高调地调用这个函数n次,我总是得到相同的结果,因为它没有任何副作用。

  • 这可以传递给更高阶的函数,如map或reduce,并且不能执行任何操作

  • 这是依赖于类型的,因为它明确地指定了它的类型,即(int=>int)

  • 有人能详细解释函数相对于命令式编程语言的方法所能提供的其他一些好处吗?


    虽然没有很多其他的优点,但是在功能语言中,函数是一流的公民(而方法不是),这是一个很大的问题。

    如果一个函数可以传递给其他函数,您就可以创建更高阶的函数,如map、filter或reduce,这比其他非函数方法要简洁得多。

    例如,让我们对列表中所有奇数的平方和:

    在非函数语言中,您会得到如下信息(注意:这是伪代码):

    1
    2
    3
    4
    5
    6
    7
    List[Int] list = new List(1, 2, 3, 4, 5, 6, 7, 8, 9);
    Int acc = 0;
    for (Int x: list) {
      if (x % 2 != 0) {
        acc += Math.Pow(x, 2);
      }
    }

    在函数scala代码中,您有:

    1
    2
    val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
    val acc = list.filter(_%2!=0).map(x=>x*x).reduce(_+_)

    即使在这个玩具例子中,它也要简洁得多。看看我们如何将函数(奇数、平方、和)传递给其他函数(过滤、映射、减少)。

    注意,这并不能赋予你新的力量:你不能以其他非功能性的方式去做不可能做的事情,这只是更容易做到的;)


    当然,我们不能用Java或C这样的命令式编程语言来做这些事情,但是我们可以用一种更抽象的方式在函数语言中做这些事情,因为它提供了更强大的抽象。事实上,我们在命令式编程语言中指定了做什么和怎么做,而我们只指定了要做的事情。函数。函数应该通过隐藏实现细节来确定如何操作。其优点是,我们不处理变量的状态,因为在lambda微积分定义的纯函数中,所有状态都是不可变的。因此,我们不会得到错误的结果,这可能会以命令式语言结束。