oop – 和过载相同吗?

函数式编程与OO编程的重载相同吗?如果没有,为什么? (尽可能使用示例)

TKS

Currying并非特定于函数式编程,而重载并非特定于面向对象的编程.

“Currying”是使用函数,您可以传递的参数少于获取其余参数的函数所需的参数.即如果我们有一个函数plus,它接受两个整数参数并返回它们的和,那么我们可以将单个参数1传递给plus,结果是一个向事物添加1的函数.

Haskellish语法中(通过邻接函数应用程序):

plusOne = plusCurried 1
three = plusOne 2
four = plusCurried 2 2
five = plusUncurried 2 3

在模糊的Cish语法中(括号括起函数):

plusOne = plusCurried(1)
three = plusOne(2)
four = plusCurried(2)(2)
five = plusUncurried(2, 3)

您可以在这两个示例中看到,仅在1个参数上调用plusCurried,结果是可以绑定到变量然后在另一个参数上调用的结果.您正在考虑将其作为函数式编程概念进行讨论的原因在于它在函数式语言中使用最多,其语法通过邻接来应用,因为语法中的currying变得非常自然. plusCurried和plusUncurried的应用程序在Haskellish语法合并中定义了四个和五个变得完全无法区分,所以你可以让所有函数始终完全被curry(即每个函数都只是一个参数的函数,只有其中一些将是返回其他函数,然后可以应用于更多参数).在带有括号参数列表的应用程序的Cish语法中,四和五的定义看起来完全不同,因此您需要区分plusCurried和plusUncurried.此外,导致当今面向对象语言(以及当今一些面向对象语言)的命令式语言从未能够将函数绑定到变量或将它们传递给其他函数(这被称为具有一流函数),并且没有那个设施,除了在所有参数上调用它之外,没有什么可以实际使用curried函数,所以没有任何意义.

currying一词也指将多个参数的函数转换为一个参数并且返回另一个函数(它接受一个参数,并且可能返回另一个函数……)的过程,并且“uncurrying”可以引用进行逆向转换的过程.

重载是一个完全不相关的概念.重载名称意味着给出具有不同特征的多个定义(参数类型,参数数量,返回类型等),并让编译器通过其出现的上下文解析名称的给定外观所指的定义.

一个相当明显的例子是我们可以定义plus来添加整数,但也使用相同的名称加上浮点数,我们可以使用它来连接字符串,数组,列表等,或添加向量或矩阵.就语言实现而言,所有这些都具有非常不同的实现,彼此无关,但我们碰巧给它们提供了相同的名称.然后编译器负责确定加上stringA stringB应该调用字符串plus(并返回一个字符串),而加上intX intY应该调用整数加(并返回一个整数).

同样,没有内在的理由说明为什么这个概念是一个“OO概念”而不是一个函数式编程概念.它恰好发生在非常自然地适用于开发的静态类型的面向对象语言中;如果你已经解析了调用该方法的对象调用哪个方法,那么它是一个小的延伸,允许更一般的重载.完全临时重载(除了多次定义相同的名称并且信任编译器来解决它)之外什么都不适合用于具有一等函数的语言,因为当你将重载的名称作为一个传递时函数本身你没有调用上下文来帮助你找出预期的定义(如果他们真正想要的是通过所有重载的定义,程序员可能会感到困惑). Haskell开发了类型类作为使用重载的更有原则的方式;这些有效地允许您一次传递所有重载的定义,并且还允许类型系统表达类似“任何定义函数f和g的类型”.

综上所述:

> currying和overloading是完全无关的> currying是关于将函数应用于少于它们所需的参数以获得剩余参数的函数>重载是为同一个名称提供多个定义,并让编译器选择每次使用名称时使用的定义> currying和overloading都不是特定于函数式编程或面向对象的编程;由于语言的发展方式,它们在各种历史语言中更为普遍,因此在一种语言中它们更有用或更明显

相关文章
相关标签/搜索