lhc-0.10: tests/1_io/basic/fastest_fib.hs
import Data.List
import Data.Word
import Data.Int
fib1 n = snd . foldl fib' (1, 0) . map toEnum $ unfoldl divs n
where
unfoldl f x = case f x of
Nothing -> []
Just (u, v) -> unfoldl f v ++ [u]
divs 0 = Nothing
divs k = Just (uncurry (flip (,)) (k `divMod` 2))
fib' (f, g) p
| p = (f*(f+2*g), f^(2::Int) + g^(2::Int))
| otherwise = (f^(2::Int)+g^(2::Int), g*(2*f-g))
main :: IO ()
main = do
print (fib1 22 :: Int)
print (fib1 22 :: Int8)
print (fib1 22 :: Int16)
print (fib1 22 :: Int32)
print (fib1 22 :: Int64)
print (fib1 22 :: Word)
print (fib1 22 :: Word8)
print (fib1 22 :: Word16)
print (fib1 22 :: Word32)
print (fib1 22 :: Word64)
print (fib1 22 :: Integer)