generics - 什么是参数多态函数?

标签 generics haskell polymorphism

谁能向我解释一下与排序算法相关的问题吗?

最佳答案

让我尝试一下我能做的最简单的事情。

假设你有一对整数:

foo :: (Int, Int) 
foo = (2,5)

假设您需要一个函数来交换该对上整数的位置。你可以这样做:

swapInt :: (Int, Int) -> (Int, Int)
swapInt (x,y) = (y,x)

但是现在,如果您需要 Double 的类似函数,则必须再次实现它:

swapDouble :: (Double, Double) -> (Double, Double)
swapDouble (x,y) = (y,x)

您必须注意以下几点:(1) swapDoubleswapInt 的代码除了类型签名之外是相同的,(2) 代码中没有任何地方您引用的任何内容都取决于 xy 的类型。无论它们的类型是什么,此代码都是有效的。因此,应该有一种方法只需编写一次代码,然后让编译器自动针对您需要的每种类型专门化代码。做到这一点的方法是参数多态性。对于这种特殊情况,您可以编写:

swap :: (a,b) -> (b,a)
swap (x,y) = (y,x)

这是什么意思?你告诉编译器:有一个函数交换,它接受一对 (x,y),其中 x 是 a 类型,y 是 b 类型,并返回对 (y,x)。 a和b可以是任意类型,因此该函数称为多态函数。当您将 swap 应用于特定对时,编译器将检查该对的类型并自动实例化适合您的元组的该函数的版本。

例如:

swap ('a', 1) = (1,'a')  -- in this case swap :: (Char, Int) -> (Int, Char) 
swap ( 0 , 5) = (5, 0 )  -- in this case swap :: (Int , Int) -> (Int, Int )

让我们来理解这个名字:多态是指可以处理多种不同类型的任何函数或数据结构。参数化原因实现多态性的方式是在函数或数据结构的类型中具有“类型参数”。当您编写 (a,b) 时,ab 是类型参数。

无论 then 中包含什么类型,都可以实现许多数据结构:列表、数组、映射、元组……所有这些都可以具有参数多态实现。对它们进行操作的函数:排序、映射、折叠……可以在不引用特定类型的情况下实现,而是引用编译器自动专门化的类型参数。

还存在其他类型的多态性,例如,Haskell 还使用类型类实现临时多态性。

关于generics - 什么是参数多态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6163425/

相关文章:

java - 在java中调用log4j记录器 "Generic Class"

c++ - 基于派生类型的编译时行为分支

java - 有没有办法更改 final方法的访问修饰符范围?

c++ - 虚拟构造函数

haskell - 为什么全新安装的 Haskell-Stack 和 GHC 如此大/大?

java - 我想了解为什么当我尝试编译并运行以下程序时会出现此警告,

objective-c - 带有通用参数的Objective-C类方法无法在Swift中调用

java - 从 Scala 调用 Java Generic Typed Method 会出现类型不匹配错误 : Scala

haskell - 在haskell中制作类似网格的数据类型

haskell - 需要配置数据的类型类实例。我有什么选择?