繁体   English   中英

什么是参数多态 function?

[英]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) swapDoubleswapInt的代码除了它们的类型签名外是相同的,(2)您在代码中没有任何地方引用任何取决于xy类型的内容. 无论其类型如何,此代码均有效。 所以应该有一种方法可以只编写一次代码,让编译器针对您需要的每种类型自动专门化代码。 实现这一点的方法是参数多态性。 对于这种特殊情况,您可以编写:

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)时, ab是类型参数。

无论 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM