2011-05-28 67 views
5

任何人可以解释这与我有关排序算法?什么是参数多态函数?

+3

你是什么意思的“搜索”? – 2011-05-28 18:05:57

+0

关于整数快速排序 – Lunar 2011-05-28 18:16:43

+2

好了,简而言之,它是[自然转换](http://en.wikipedia.org/wiki/Natural_transformation)。但是说这样只会使问题复杂化。 – 2011-05-28 18:25:29

回答

7

让我试试我能做到的最简单的事情。

假设你有一对整数:

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

,并假设你想要的交换上对整数的位置的功能。你可以这样做:

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

但如果你现在需要Double提供了一个类似的功能,你就必须实现它againt:

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

你必须要注意的几件事情:( 1)swapDoubleswapInt的代码除了它们的类型签名外都是相同的,(2)代码中没有任何地方提及任何取决于xy的类型的内容。此代码无论它们的类型是否有效。所以应该有一种方法来编写代码一次,让编译器自动为您需要的每种类型专门编写代码。做到这一点的方法是参数多态。对于这种特殊情况,你可以写:

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

这是什么意思?你告诉编译器:有一个函数swap,它取一对(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是类型参数。

许多数据结构可以被实现而不管包含在那里的类型:列表,数组,映射,元组......,它们都可以具有参数多态的实现。并且对它们进行操作的函数:sort,map,fold ......可以在不需要引用特定类型的情况下实现,而是可以输入将由编译器自动进行特定的参数。例如,存在其他种类的多态性,并且Haskell也实现特别的多态性。

2

参数多态允许函数或数据类型一般地编写,以便它可以在不依赖于类型的情况下以相同的方式处理值。参数多态是一种使语言更具表现力,同时仍保持全静态类型安全性的方法。

- from:http://en.wikipedia.org/wiki/Polymorphism_(computer_science)。

对于搜索,我想这更多取决于确切的上下文 - 我无法帮到那里。

+1

可能是这种情况。 最简单的情况是'id :: a - > a'',它可以是任何类型的值,并且返回相同的值(当然仍然具有相同的类型)。没有多态性,你必须为所有类型 – 2011-05-28 18:07:42

+0

声明'idInt :: Int - > Int'' idString :: String - > String'等。另外值得注意的是,因为它很容易忘记。 “参数化”仅仅意味着函数的功能是基于其给定的参数。道歉,如果这是显而易见的。 – Adam 2011-05-28 18:12:22

6

一个函数,它与它所使用的参数类型无关。

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可以在任何类型的列表上执行线性搜索;这就是使函数参数化(意思是函数参数)多态(因为它们可以是多种类型)。

# 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" 

在谈论这个函数的类型时,它被声明为(a -> b -> Bool) -> a -> [b] -> Maybe b。重要的是,字母表示类型变量,这意味着它们的类型可以是任何东西 - 也是使参数多态的函数的属性。

+0

首先,'(a - > b - > Bool) - > a - > [b] - > Maybe b'中缺少'b'。其次,它应该是'只是x'而不是'只是n'。 – Rotsor 2011-05-29 07:25:10