我只想尽力将以下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)
答案 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]