main = do -- main-funktio määrittää mitä tapahtuu kun ohjelma suoritetaan
-- Kysytään käyttäjältä kuinka monta lukua hän aikoo syöttää
putStrLn "Kuinka monta lukua syötät?"
-- getLine lukee yhden syötetyn tekstirivin, "liftM read" muuntaa sen String:istä Int:iksi.
-- (olettaen että käyttäjä syötti validin kokonaisluvun, muussa tapauksessa ohjelma kuolee)
-- Lopuksi tulos tallennetaan "muuttujaan" n.
n <- liftM read getLine
-- Luodaan IO-operaatio joka pyytää käyttäjää syöttämään luvun ja lukee sitten yhden rivin inputia.
-- Tämä operaatio toistetaan (replicate) n kertaa ja saadaan sekvenssi joka palauttaa listan kaikista
-- riveistä jotka käyttäjä syötti. Lista tallennetaan "muuttujaan" numbers.
numbers <- sequence (replicate n (putStr "Syötä luku: " >> getLine))
-- Sovelletaan vanhaa tuttua read:ia numbers-listan jokaiseen elementtiin ja saadaan täten lista
-- oikeita desimaalilukuja String:ien sijaan. Lasketaan tämän uuden listan summa (sum) ja tallennetaan
-- se "muuttujaan" numSum.
let numSum = sum (map read numbers)
-- Jaetaan summa numerojen lukumäärällä n.
-- (fromIntegral muuntaa n:än kokonaisluvusta desimaaliluvuksi jotta jako on mahdollinen)
-- Tallennetaan tulos "muuttujaan" average.
let average = numSum / fromIntegral n
-- Tulostetaan syötettyjen lukujen keskiarvo.
putStrLn ("Syötettyjen lukujen keskiarvo on: " ++ show average)