import Data.Ratio import Data.List import Data.Char bernoulli :: Integer -> Rational bernoulli n |n==0 = fromIntegral 1 |otherwise = last (bern n [1] 1) where bern y xs nn |length xs -1== fromIntegral y = xs |otherwise = bern y (xs ++ [sum[(choose nn (k-1))%(k-nn-2)*(last (take (fromIntegral k) xs))|k<-[1..nn]]] ) (nn+1) choose :: Integer -> Integer -> Integer n `choose` k = product [n-k+1..n] `div` product (enumFromTo 1 k)