[Haskell-cafe] Writing insertionSort using foldr and a helper function

Jerzy Karczmarczuk jerzy.karczmarczuk at unicaen.fr
Thu Sep 29 19:58:31 UTC 2016


Le 29/09/2016 à 20:09, jorgemal1960 at gmail.com a écrit :
> I have the following function that takes an element and a list and 
> inserts the element into the list at the first position where it is 
> less than or equal to the next element.
>
** This is most probably  some pedagogic assignment, and you should not 
expect from the community to solve your exercices.
I suspect that you tried to solve the problem without trying to 
UNDERSTAND foldr...
But let's see...
> |
> myInsert :: Ord a => a -> [a] -> [a]
> myInsert x [] = [x]
> myInsert x (y:ys) = if x < y then x:y:ys else y:myInsert x ys
> |
>
> Now, I have to use the above function myInsert and foldr to implement 
> another function called insertionSort. I have been able to do it 
> without using foldr as follows and it works just fine:
> ...
OK.

> I have worked for 2 days to use foldr without success, for example:
>
> |
> insertionSort :: Ord a => [a] -> [a]
> insertionSort [] = []
> insertionSort [x] = [x]
> insertionSort (x:xs) = foldr (myInsert) x (insertionSort xs)
> |
>
> But it does not even compile, I get the following error which refers 
> to last instruction at position "x" in "foldr (myInsert) x 
> (insertionSort xs)":
>
> Couldn't match expected type ‘[a]’ with actual type ‘a’

A. You should have learnt that the usage of generic functionals such as 
foldr is to avoid explicit recursion. Please, look up some examples of 
foldr, for example in https://wiki.haskell.org/Fold, or in the Standard 
Prelude, say: 
https://www.haskell.org/onlinereport/standard-prelude.html  (e.g., the 
definition of concat).

B. So, no need for pattern split x:xs in your main definition, define just
insertionSort xs = ...

C. Mind the type of foldr, : (a -> c -> c) -> c -> [a] -> c .
The type of your function is ok (parentheses redundant), but the second 
argument is the initial container (list) while you have chosen "x", 
which is an element. Here the typechecker protests, but this is not your 
only mistake.
The third element of foldr is the processed container (also list), just 
it, no recursion. And your first two clauses of insertionSort are useless.

Jerzy Karczmarczuk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160929/5fdd1049/attachment.html>


More information about the Haskell-Cafe mailing list