无法推断出错误类型

时间:2015-11-21 14:04:13

标签: haskell

我们必须编写一个代码,它将对列表的元素进行排序。

为此,我们必须使用两个帮助功能。 在我的情况下,计算(给出列表的最大/最小)和删除(将删除最大/最小)。

多么令人惊讶,它没有用;)。

运行代码,我总是得到:“无法推断(Ey(a-> a-> Bool))因使用'sort'而产生的”

有什么建议吗?

sort p [] = []
sort p ls = selected : sort p (delete)
 where
  selected =  calculate p ls
  calculate p ls
                | p == < =  minimum ls
                | otherwise = maximum ls
  delete = del selected ls
  del selected ls = filter (/= selected) ls

1 个答案:

答案 0 :(得分:0)

这是一个应该接近你的想法的版本(采用列表的最少元素,然后对其余元素进行排序):

import Data.List (delete)

sort :: Ord t => [t] -> [t]
sort [] = []
sort ls = selected : sort (delete selected ls)
 where selected = minimum ls

不会缩短列表:

λ> sort [2,4,6,1,2,5]
[1,2,2,4,5,6]

接受函数来决定是否要对降序或升序进行排序的想法可以这样做:

import Data.List (delete, minimumBy)
import Data.Function (on)

sort :: Eq t => (t -> t -> Ordering) -> [t] -> [t]
sort _ [] = []
sort p ls = selected : sort p (delete selected ls)
 where selected = minimumBy p ls

示例:

λ> sort (compare) [2,4,6,1,2,5]
[1,2,2,4,5,6]
λ> sort (compare `on` negate) [2,4,6,1,2,5]
[6,5,4,2,2,1]

当然这不是一个很好的排序算法

现在你应该再次查看你的版本并考虑如何修复它 - 例如,有一种方法可以使用maximum来使列表按降序排序

使用(<)(>)

然后想法基本上重写minimum并使用你传递的 compare 函数:

import Data.List (delete, foldr1)

sort :: Eq t => (t -> t -> Bool) -> [t] -> [t]
sort _ [] = []
sort p ls = extremum : sort p (delete extremum ls)
  where extremum  = foldr1 (\ a b -> if p a b then a else b) ls

示例:

λ> sort (<) [2,4,6,1,2,5]
[1,2,2,4,5,6]
λ> sort (>) [2,4,6,1,2,5]
[6,5,4,2,2,1]