试图感受haskell。 我是一名经验丰富的程序员,拥有PHP,JAVA,VB和许多其他语言,但我发现haskell稍微难以理解。 任何人都可以为我提供以下haskell功能的英文翻译,让我开始...
quicksort [] = []
quicksort (x:xs) = quicksort [y | y <- xs, y<x ]
++ [x]
++ quicksort [y | y <- xs, y>=x]
英语翻译的一个例子在下面的评论中:
// --- FOR_LOOP ->
// --- $abc goes from 1 to 10 ->
// --- If $abc is even - print $abc is even ->
// --- else if $abc is odd - print $abc is odd ->
// --- END_FOR_LOOP
for( $abc = 1 ; $abc <= 10 ; $abc++ ){
if( $abc % 2 == 0 ){
echo $abc . " is even";
}
else{
echo $abc . " is odd";
}
}
第一行很简单,阅读: “空列表中的函数快速排序会产生一个空列表作为结果”...... 如果你能将haskell的其余部分翻译成英文,那将非常有用。
答案 0 :(得分:13)
快速排序空列表的结果是空列表。
快速排序非空列表的结果,我们称之为列表x
的第一个元素,其余元素xs
为:快速排序{{1}的所有元素的结果小于x(*),后跟x,然后快速排序xs中大于x的所有元素的结果。
(*)详细说明:xs
可以读作“y在xs和[y | y <- xs, y<x ]
中所有y的列表”。
答案 1 :(得分:4)
大学毕业后没有这样做......
它是递归的 - 第一行是空集的情况。
quicksort [] = []
接下来的几行在非空集上运行。 (x:xs)语法将其分解为单个元素(x)和其余元素(xs)。
quicksort (x:xs) = quicksort [y | y <- xs, y<x ]
++ [x]
++ quicksort [y | y <- xs, y>=x]
第一行,quicksort [y | y&lt; -xs,y&lt; x],对来自小于x的xs的所有元素的集合(即,来自xs的每个y小于x)调用快速排序。如果xs是空集,则quicksort []将返回[]。
中间一行只是包含x的集合。
最后一行,quicksort [y | y&lt; -xs,y&gt; = x],对来自大于或等于x的xs的所有元素的集合调用快速排序(即,xs中的每个y大于或等于x)。如果xs是空集,则quicksort []将返回[]。
最终结果是有序集。
答案 2 :(得分:2)
这是一种声明性语言,所以你只需阅读你所看到的内容。 sepp2k在上面做了一个很好的例子。
答案 3 :(得分:2)
检查http://learnyouahaskell.com/recursion#quick-sort它确切地解释了快速排序的作用。
答案 4 :(得分:2)
如果你的问题是熟悉列表推导,那么这里有一些或多或少相同的替代版本:
quicksort [] = []
quicksort (x:xs) =
quicksort (filter (< x) xs) ++
[x] ++
quicksort (filter (>= x) xs)
quicksort [] = []
quicksort (x:xs) =
quicksort smaller ++ [x] ++ quicksort bigger
where
(smaller, bigger) = partition (< x) xs
答案 5 :(得分:0)
这不会直接回答您的问题,但hoogle可能有助于您的学习,您可以使用它通过函数名称或近似类型签名搜索标准API库。
以下是它支持的搜索字词的示例:
map
(a -> b) -> [a] -> [b]`
Ord a => [a] -> [a]
Data.Map.insert