我们必须编写一个代码,它将对列表的元素进行排序。
为此,我们必须使用两个帮助功能。 在我的情况下,计算(给出列表的最大/最小)和删除(将删除最大/最小)。
多么令人惊讶,它没有用;)。
运行代码,我总是得到:“无法推断(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
答案 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]