]> gitweb.michael.orlitzky.com - spline3.git/commitdiff
Add bang patterns to the Misc module and use them to write a faster
authorMichael Orlitzky <michael@orlitzky.com>
Tue, 25 Oct 2011 04:00:19 +0000 (00:00 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Tue, 25 Oct 2011 04:00:19 +0000 (00:00 -0400)
factorial function (Ben Lippmeier).

src/Misc.hs

index b1cb1affcce0a53463c5f9ae400c5da27fabd157..4b285e4cc3b0cff1f8344aa09c905ed6b0c3fe99 100644 (file)
@@ -1,3 +1,4 @@
+{-# LANGUAGE BangPatterns #-}
 -- | The Misc module contains helper functions that seem out of place
 --   anywhere else.
 module Misc
@@ -24,11 +25,12 @@ import Test.QuickCheck
 --   24
 --
 factorial :: Int -> Int
-factorial n
-    | n <= 1 = 1
-    | n > 20 = error "integer overflow in factorial function"
-    | otherwise = product [1..n]
-
+factorial !n
+    | n > 20    = error "integer overflow in factorial function"
+    | otherwise = go 1 n
+    where go !acc !i
+                | i <= 1    = acc
+                | otherwise = go (acc * i) (i - 1)
 
 -- | Takes a three-dimensional list, and flattens it into a
 --   one-dimensional one.