Personal tools

Shootout/Ack

From HaskellWiki

Jump to: navigation, search

A Shootout entry for the ackermann function

1 Code

All the following entries have the same performance. The difference is loc. The idea is to beat the SML entry of 4 loc. Performance is already excellent.

Interestingly, all run much faster when compiled with -fasm.

2 Proposal

-- http://shootout.alioth.debian.org/
-- shortened by Bryn Keller, Einar Karttunen and Don Stewart
 
import System
 
main = getArgs >>= \[n] -> putStrLn . (("Ack(3,"++n++"): ")++) . show . ack 3 $ read n
 
ack (0::Int) (n::Int) = n+1
ack  m        n       = ack (m-1) $ if n == 0 then 1 else ack m (n-1)

3 Original entry

7 loc

{-# OPTIONS -O2 -fasm #-}
-- $Id: ackermann-ghc.code,v 1.27 2006/01/08 22:44:56 igouy-guest Exp $
-- http://shootout.alioth.debian.org/
-- shortened by Bryn Keller and Einar Karttunen
 
import System(getArgs)
 
main = do ~[num] <- getArgs
          putStrLn ("Ack(3," ++ num ++ "): " ++ (show (ack 3 (read num))))
 
ack :: Int -> Int -> Int
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))