Skip to content

Instantly share code, notes, and snippets.

@mathiasverraes
Created September 9, 2015 18:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mathiasverraes/7a1f710bead4a57bc48c to your computer and use it in GitHub Desktop.
Save mathiasverraes/7a1f710bead4a57bc48c to your computer and use it in GitHub Desktop.
Collatz sequences in Haskell using a Writer monad. Not that you need one. For science!
module Collatz where
import Control.Monad.Writer
collatzSeq :: Integer -> Writer [Integer] Integer
collatzSeq n = do
n <- collatz n
if n==1 then return 1 else collatzSeq n
collatz :: Integer -> Writer [Integer] Integer
collatz n
| n == 1 = do
tell [n]
return 1
| even n = do
tell [n]
return (n `div` 2)
| otherwise = do
tell [n]
return (3 * n + 1)
-- ghci> runWriter $ return 13 >>= collatzSeq
-- (1,[13,40,20,10,5,16,8,4,2])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment