git.fiddlerwoaroof.com
Raw Blame History
   
-- This is a parallel varient of factorial

module Main where

fac :: Int -> Int
fac 0 = 1
fac n = pfac 1 n

pfac :: Int -> Int -> Int
pfac low high | low == high     = low
              | low + 1 == high = (low * high)
              | otherwise       = pfac low mid * pfac (mid + 1) high
    where
       mid = (high + low) `div` 2

main = appendChan stdout "Type in N: " abort $
       readChan stdin abort $ \ input ->
       appendChan stdout (show (fac (read (head (lines input))))) abort done