如何在Idris中编写一个简单的基于列表的快速排序?

时间:2018-05-08 00:10:11

标签: idris

我只想尽力将以下Haskell翻译成Idris(我不是在寻找效率或正确性的证据):

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

这里是我的Idris代码,除了需要告诉Idris我们正在处理Ordered类型之外,它与Haskell基本没有变化:

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

但是,我显然做错了。我在Quicksort in Idris的问题中看到了一个答案,但形式有点不同 - 我想了解当前方法的问题。我上面的代码给出了错误:

40 | quicksort (x::xs)       =  quicksort [y | y <- xs, y<x ]
   |                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
When checking right hand side of quicksort with expected type
        List b

When checking an application of function Prelude.Applicative.guard:
        Can't find implementation for Ord (Ord b)

1 个答案:

答案 0 :(得分:1)

问题是Prelude.Applicative.guard(用于列表推导中的守卫的功能)无法找到Ord类型类的实现。

这告诉我们,我们还没有添加(或添加错误的)类型类约束。如果我们将您的代码更改为此代码,它应该可以工作:

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