Haskell - 函数式编程帮助

时间:2009-09-11 20:00:43

标签: haskell

试图感受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的其余部分翻译成英文,那将非常有用。

6 个答案:

答案 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