任何人可以解释这与我有关排序算法?什么是参数多态函数?
回答
让我试试我能做到的最简单的事情。
假设你有一对整数:
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)swapDouble
和swapInt
的代码除了它们的类型签名外都是相同的,(2)代码中没有任何地方提及任何取决于x
和y
的类型的内容。此代码无论它们的类型是否有效。所以应该有一种方法来编写代码一次,让编译器自动为您需要的每种类型专门编写代码。做到这一点的方法是参数多态。对于这种特殊情况,你可以写:
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)
时,a
和b
是类型参数。
许多数据结构可以被实现而不管包含在那里的类型:列表,数组,映射,元组......,它们都可以具有参数多态的实现。并且对它们进行操作的函数:sort,map,fold ......可以在不需要引用特定类型的情况下实现,而是可以输入将由编译器自动进行特定的参数。例如,存在其他种类的多态性,并且Haskell也实现特别的多态性。
参数多态允许函数或数据类型一般地编写,以便它可以在不依赖于类型的情况下以相同的方式处理值。参数多态是一种使语言更具表现力,同时仍保持全静态类型安全性的方法。
- from:http://en.wikipedia.org/wiki/Polymorphism_(computer_science)。
对于搜索,我想这更多取决于确切的上下文 - 我无法帮到那里。
可能是这种情况。 最简单的情况是'id :: a - > a'',它可以是任何类型的值,并且返回相同的值(当然仍然具有相同的类型)。没有多态性,你必须为所有类型 – 2011-05-28 18:07:42
声明'idInt :: Int - > Int'' idString :: String - > String'等。另外值得注意的是,因为它很容易忘记。 “参数化”仅仅意味着函数的功能是基于其给定的参数。道歉,如果这是显而易见的。 – Adam 2011-05-28 18:12:22
一个函数,它与它所使用的参数类型无关。
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
。重要的是,字母表示类型变量,这意味着它们的类型可以是任何东西 - 也是使参数多态的函数的属性。
首先,'(a - > b - > Bool) - > a - > [b] - > Maybe b'中缺少'b'。其次,它应该是'只是x'而不是'只是n'。 – Rotsor 2011-05-29 07:25:10
- 1. 为什么在Ocaml中函数参数不能是多态的?
- 2. 函数参数,多态性
- 3. OpenCV:WarpPerspective函数的参数是什么?
- 4. 什么是current_user_can()函数参数?
- 5. 什么是非静态成员函数?
- 6. 为什么CanvasRenderingContext2D.createLinearGradient()不是静态函数?
- 7. 静态函数的语法是什么?
- 8. int const函数(参数),int函数(const参数)和int函数(参数)const之间的区别是什么?
- 9. 多态函数参数/返回值C
- 10. 什么是传递多个参数
- 11. T应该是一个参数,一个函数还是什么?
- 12. debug_backtrace()捕获什么状态的函数参数?
- 13. 为什么函数参数中没有动态位模式?
- 14. Java的setAlignment函数有什么参数?
- 15. 什么参数传递给EOF()函数
- 16. 为什么使用更少/更多的参数重载函数?
- 17. 为什么我的Excel函数有太多的参数?
- 18. graphics setColor - 参数是什么?
- 19. addTouchEventListener的参数是什么
- 20. ns是什么参数?
- 21. 什么是ximgproc_DisparityWLSFilter.filter()参数?
- 22. 什么是(void *的)参数
- 23. 什么是“struct file_operations”参数?
- 24. Renderscript,`in`参数是什么?
- 25. 什么是sysctl()的参数?
- 26. 什么是Twilio URL参数?
- 27. sem_init(...):什么是pshared参数?
- 28. 什么是overwritting参数
- 29. 什么是父参数?
- 30. 什么是关系参数?
你是什么意思的“搜索”? – 2011-05-28 18:05:57
关于整数快速排序 – Lunar 2011-05-28 18:16:43
好了,简而言之,它是[自然转换](http://en.wikipedia.org/wiki/Natural_transformation)。但是说这样只会使问题复杂化。 – 2011-05-28 18:25:29