For me there is just no such thing as spare time any more - it’s basically time when I should be doing something else. So when this popped up I thought it would be an ideal time to learn a bit of Haskell. I had a quick play at the time and had the “Oh! Haskell doesn’t have mutable variables!” revelation (although I didn’t know they were called mutable back then) had a bit more of a play with recursion, etc and then got busy with other stuff for, well, almost a year(!) until I ‘found’ time again:

-- Selection Sort in Haskell 
-- Cheating by using IORef for mutable variables since I don't know what I'm doing
-- with Haskell, although do have an inkling that the benefit of Haskell is that
-- all of below can be done in about three lines. 
-- Assumes integer input only.

import Data.IORef
import Data.List.Split	-- cabal install split 
						-- I'm not even going to think about doing this myself.
						-- Used to get a comma delimted string as a list

main = do 
	-- Set up 'variables'
	putStr "Enter List to Sort:"
	stringinput <- getLine
	let listinput = splitOn "," stringinput -- Convert comma delimited string to list
	let intinput = [ read x :: Int | x <- listinput]	--Convert list of strings to list of Integers
														--Need to specify type
	unsortlistIO <- newIORef intinput
	elementIO <- newIORef []
	sortlistIO <- newIORef []
	sort unsortlistIO elementIO sortlistIO

sort unsortlistIO' elementIO' sortlistIO' = do
	unsortlist <- (readIORef unsortlistIO')
	sortlist <- (readIORef sortlistIO') -- initialise, for all intents and purposes
	--print unsortlist --debug
	if ((length unsortlist) > 0)
		then do -- Note to self: Must remember to ident these after if!

			-- find smallest element(s)
			unsortlist <- (readIORef unsortlistIO')
			writeIORef elementIO'  (filter (==(minimum unsortlist)) unsortlist)
			element <- readIORef elementIO'

			-- Add to sorted list
			sortlist <- readIORef sortlistIO'
			writeIORef sortlistIO' (sortlist++element)

			-- remove from original list
			writeIORef unsortlistIO' (filter (not.(==(minimum unsortlist))) unsortlist)

			readIORef sortlistIO'
			--print sortlist --debug
			sort unsortlistIO' elementIO' sortlistIO' -- loop. Ha!
		else return sortlist -- Note to self: must be careful about returning the right type of thing

Link to gist

I gather the benefit of Haskell is that this can actually be written in a couple of lines. Maybe in another eleven months time I’ll have figured that out.