[英]What is a parametrically polymorphic function?
有人可以就排序算法向我解释一下吗?
让我尝试我能做的最简单的事情。
假设你有一对整数:
foo :: (Int, Int)
foo = (2,5)
并假设您想要一个 function 交换该对上整数的 position。 你可以这样做:
swapInt :: (Int, Int) -> (Int, Int)
swapInt (x,y) = (y,x)
但是现在如果你需要一个类似的 function 用于Double
s,你必须再次实现它:
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)
这意味着什么? 您是在告诉编译器:有一个 function 交换,它采用一对 (x,y),其中 x 是 a 类型,y 是 b 类型,并返回对 (y,x)。 a 和 b 可以是任何类型,因此这个 function 称为多态 function。 当您将swap
应用于特定对时,编译器将检查该对的类型并自动实例化此 function 的版本,该版本足以满足您的元组。
例如:
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 )
让我们理解这个名称:多态是任何 function 或适用于许多不同类型的数据结构。 参数化实现多态性的方式是在function或数据结构的类型中具有“类型参数”。 当您编写(a,b)
时, a
和b
是类型参数。
无论 then 中包含何种类型,都可以实现许多数据结构:列表、arrays、映射、元组……它们都可以具有参数化的多态实现。 以及对它们进行操作的函数:sort、map、fold、... 可以在不必引用特定类型的情况下实现,但要输入编译器会自动专门化的参数。
还存在其他类型的多态性,例如,Haskell 也使用类型类实现临时多态性。
一个 function 与它使用的参数类型无关。
linear_search f n [] = Nothing
linear_search f n (x:xs)
| f n x = Just x
| otherwise = linear_search f n xs
我的 Haskell 生锈了,所以如果有人能纠正评论中的错误,将不胜感激。
这里的想法是linear_search
可以对任何类型的列表进行线性搜索; 这就是使 function 参数化(即 function 参数)多态的原因(因为它们可以是多种类型)。
# preforming on integers
linear_search (==) 5 [1,2,3,4,5]
# returns Just 5
# preforming on strings
linear_search (elem) 'e' ["doctor", "apron", "horse", "sky"]
# returns Just "horse"
当谈到这个 function 的类型时,它被表述为(a -> b -> Bool) -> a -> [b] -> Maybe b
。 重要的是,字母表示类型变量,这意味着它们的类型可以是任何东西——这也是使函数参数多态的属性。
参数多态性允许 function 或数据类型被通用写入,因此它可以相同地处理值而不依赖于它们的类型。 参数多态性是一种使语言更具表现力的方法,同时仍保持完整的 static 类型安全。
-- 来自: http://en.wikipedia.org/wiki/Polymorphism_(computer_science )。
关于搜索,我想这更多地取决于确切的上下文 - 我无能为力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.