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

标签 idris

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

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

这是我的 Idris 代码,除了需要告诉 Idris 我们正在处理有序类型之外,它与 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)

最佳答案

问题是 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]

关于idris - 如何在 Idris 中编写一个简单的基于列表的快速排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50224043/

相关文章:

lazy-evaluation - 我可以在 Idris 中证明 (s : Stream a) -> (head s::tail s = s) 吗?

typechecking - Idris 函数构造空的 `List a` ,其中 `a` 绑定(bind)到 `Ord` 的实例?

haskell - 使用依赖类型语言进行编程时,我们如何克服编译时间和运行时差距?

types - 依赖类型

pattern-matching - 关于依赖于其替代顺序的函数的证明

haskell - Idris 中依赖类型的限制

idris - 在 where 子句中省略类型声明的条件

idris - 我如何让Idris取消映射向量以推断类型?

dependent-type - 如何在 Idris 中重写函数体,以便类型对应于函数签名并且整个事物都可以编译

dependent-type - 在Idris中进行秩N量化