谁能向我解释一下与排序算法相关的问题吗?
最佳答案
让我尝试一下我能做的最简单的事情。
假设你有一对整数:
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) swapDouble
和 swapInt
的代码除了类型签名之外是相同的,(2) 代码中没有任何地方您引用的任何内容都取决于 x
和 y
的类型。无论它们的类型是什么,此代码都是有效的。因此,应该有一种方法只需编写一次代码,然后让编译器自动针对您需要的每种类型专门化代码。做到这一点的方法是参数多态性。对于这种特殊情况,您可以编写:
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)
时,a
和 b
是类型参数。
无论 then 中包含什么类型,都可以实现许多数据结构:列表、数组、映射、元组……所有这些都可以具有参数多态实现。对它们进行操作的函数:排序、映射、折叠……可以在不引用特定类型的情况下实现,而是引用编译器自动专门化的类型参数。
还存在其他类型的多态性,例如,Haskell 还使用类型类实现临时多态性。
关于generics - 什么是参数多态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6163425/