【问题标题】:Insertionsort in Haskell with specified orderHaskell中具有特定顺序的插入排序
【发布时间】:2016-05-17 10:34:02
【问题描述】:

我正在尝试在 Haskell 中为我的每周大学作业实施插入排序。这是我的插入和排序功能:

  insert :: (Ord a) => a -> [a] -> [a]
  insert a [] = [a]
  insert a (a':as)
       | a <= a'   = a:a':as
       | otherwise = a':insert a as


  insertionSort :: (Ord a) => [a] -> [a]
  insertionSort   []      = []
  insertionSort (a:as) = insert a (insertionSort as)

这可行,但我的导师这样指定签名:

insert :: (a -> a -> Bool) -> a -> [a] -> [a]
insertionSort :: (a -> a -> Bool) -> [a] -> [a]

我现在尝试的一切都失败了,编译器错误也没有真正的帮助。希望你们能帮我解决这个问题!

编辑:

我的导师给出的例子是这样的:

Main> insert (<) 3 [1,2,5,7,9]
[1,2,3,5,7,9]
Main> insSort (>) [7,9,1,2,5]
[9,7,5,2,1]

【问题讨论】:

    标签: haskell insertion-sort


    【解决方案1】:

    您需要做的就是使用布尔函数参数的结果而不是固定比较,如下所示:

    insert :: (Ord a) => (a -> a -> Bool) -> a -> [a] -> [a]
    insert _ a [] = [a]
    insert f a (a':as)
         | f a a'   = a:a':as
         | otherwise = a':insert f a as
    

    其他功能也是如此。

    insertionSort :: (Ord a) => (a -> a -> Bool) -> [a] -> [a]
    insertionSort _  []      = []
    insertionSort f (a:as) = insert f a (insertionSort f as) 
    

    Demo

    【讨论】:

    • 非常感谢!我读到 (Ord a)、(>) 和 (a->a->Bool) 都是等价的。那是对的吗?如果是,你为什么需要 (insert :: (Ord a) => (a->a->Bool) -> a ...) 而不是 (insert :: (a->a->Bool) - > a ...)?
    • @GabbaGandalf 它们都不是等效的。 (Ord a) =&gt; ... 声明 a 需要是可排序的数据类型。 (&gt;) 是一个函数。这与写(\a b -&gt; a &gt; b) 相同。最后,(a -&gt; a -&gt; Bool) 是一个类型描述:它描述了一个函数,该函数接受两个 a 类型的值并返回一个 Bool
    • 谢谢,很高兴知道。所以语句 (Ord a) => ... 只是防止运行时错误?
    • @GabbaGandalf 语句(Ord a) =&gt; 指定类型a 需要是可订购的。该函数是一种排序,因此放置该限制是有意义的(或者更确切地说,对不可排序的东西进行排序是没有意义的)。由于这个声明,开发人员和编译器都知道他们在调用insertionSort 时需要一个可排序的列表。我不确定这个解释是否很清楚,不要犹豫发表评论要求澄清(请使用@,以便我收到您的回复通知)。
    • @ThomasFrancois 这个解释对我来说很有意义,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 2011-07-10
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多