【问题标题】:Haskell - Functional Programming HelpHaskell - 函数式编程帮助
【发布时间】:2025-12-15 20:15:01
【问题描述】:

尝试感受一下haskell。 我是一名经验丰富的 PHP、JAVA、VB 和许多其他语言的程序员,但我发现 haskell 有点难以理解。 谁能给我以下haskell函数的英文翻译,让我开始...

quicksort []     = []
quicksort (x:xs) = quicksort [y | y <- xs, y<x ]
                   ++ [x]
                   ++ quicksort [y | y <- xs, y>=x]

英文翻译的例子在下面的 cmets 中:

// --- 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 的其余部分翻译成英文,那将非常有帮助。

【问题讨论】:

  • 我真的很喜欢在大学里和 Haskell 一起工作 - 出于某种原因,它对我很有吸引力。美好的回忆……
  • 不错的答案小伙子们 - 这正是我想要的 - 干杯!
  • 另外一个问题:这个算法的主要弱点是什么?
  • @Kathy:它没有就地排序。现在这确实感觉像学校:)
  • @Shaun:不,这只是效率低下。想想它在面对 [1..100] 时的行为。

标签: haskell


【解决方案1】:

空列表快速排序的结果是空列表。

快速排序一个非空列表的结果,这里我们称列表的第一个元素x,其余元素xs是:快速排序xs的所有小于x的元素的结果(*),后面是x,后面是xs中所有大于x的元素快速排序的结果。

(*) 详细说明一下:[y | y &lt;- xs, y&lt;x ] 可以理解为“y 位于 xs 和 y&lt;x 中的所有 y 的列表”。

【讨论】:

    【解决方案2】:

    自从大学以来就没有这样做过......

    它是递归的 - 第一行是空集的情况。

    quicksort []     = []
    

    接下来的几行在一个非空集合上运行。 (x:xs) 语法将其分解为单个元素 (x) 和其余元素 (xs)。

    quicksort (x:xs) = quicksort [y | y <- xs, y<x ]
      ++ [x]
      ++ quicksort [y | y <- xs, y>=x]
    

    第一行,快速排序 [y | y

    中间的一行就是包含 x 的集合。

    最后一行,快速排序 [y | y =x],针对 xs 中大于或等于 x 的所有元素的集合调用快速排序(即 xs 中大于或等于 x 的每个 y)。如果 xs 是空集,那么 quicksort [] 将返回 []。

    最终结果是一个有序集合。

    【讨论】:

    • "最终结果是一个有序集合。" - 这不是一个集合,它是一个列表。 quicksort [1,2,3,1,2,3] 将返回 [1,1,2,2,3,3]。注意重复的条目。
    【解决方案3】:

    这是一种声明性语言,因此您只需读出您所看到的内容。 sepp2k 在上面做了一个很好的例子。

    【讨论】:

      【解决方案4】:

      检查http://learnyouahaskell.com/recursion#quick-sort,它准确地解释了快速排序的作用。

      【讨论】:

        【解决方案5】:

        如果您的问题是不熟悉列表推导式,这里有一些或多或少相同的替代版本:

        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
        

        【讨论】:

          【解决方案6】:

          这并不能直接回答您的问题,但hoogle 总体上可能有助于您的学习,您可以使用它通过函数名称或近似类型签名来搜索标准 api 库。

          以下是它支持的搜索词示例:

          map
          (a -> b) -> [a] -> [b]`
          Ord a => [a] -> [a]
          Data.Map.insert
          

          【讨论】: