在Haskell中插入排序

时间:2015-02-16 21:08:01

标签: haskell functional-programming

我在Haskell上做了一些练习。首先我被要求定义一个函数insert :: Int -> [Int] -> [Int],以便insert x xs 将x插入到列表xs中,使x大于那些x 它之前的元素和小于或等于的元素 跟着它:

insert :: Int -> [Int] -> [Int]
insert x [] = [x]
insert x (y:ys) = if x < y 
                 then x:y:ys 
         else y : insert x ys

现在我需要使用插入来定义函数insertionSort :: [Int] -> [Int]。这是我的尝试:

insertionSort :: [Int] -> [Int]
insertionSort [x] = [x]
insertionSort (x:xs) = insert x insertionSort xs
  

错误:无法将预期类型[Int]与实际类型[Int]匹配 - &gt; [INT]

任何人都知道如何解决这个问题?非常感谢任何见解,谢谢。

2 个答案:

答案 0 :(得分:9)

insert x insertionSort xs

使用三个参数(insertxinsertionSort)调用xs。 可能你想要

insert x (insertionSort xs)

答案 1 :(得分:8)

在自己学习一些排序算法的同时,我想为您的解决方案提供一些建议/改进:

  • 在任何情况下都避免使用非详尽的模式匹配:insertionSort [] = []
  • 利用Ord超过固定类型的实例
  • 通过将insert集成到where语句中来考虑 lambda lifting ,以便摆脱高级函数并保存参数x
  • 如果是
  • ,请在上考虑警卫

这将导致:

insertionSort :: Ord a => [a] -> [a]
insertionSort [] = []
insertionSort [x] = [x]
insertionSort (x:xs) = insert $ insertionSort xs
    where insert [] = [x]
          insert (y:ys)
              | x < y = x : y : ys
              | otherwise = y : insert ys