Я просто пытаюсь сделать минимум, чтобы перевести следующий Haskell на Idris (я не ищу эффективность или доказательства правильности):
quicksort [] = []
quicksort (x:xs) = quicksort [y | y <- xs, y<x ]
++ [x]
++ quicksort [y | y <- xs, y>=x]
Вот код Idris, который у меня есть, который практически не отличается от кода на Haskell, за исключением необходимости сообщать Idris, что мы имеем дело с упорядоченными типами:
quicksort: List (Ord b) -> List (Ord b)
quicksort [] = []
quicksort (x::xs) = quicksort [y | y <- xs, y<x ]
++ [x]
++ quicksort [y | y <- xs, y>=x]
Тем не менее, я, очевидно, делаю это неправильно. Я вижу, что в вопросе есть ответ на Быстрая сортировка в Идрисе , но форма немного другая - я хотел бы понять, что не так с текущим подходом. Мой код выше выдает ошибку:
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)