From: Michael Orlitzky Date: Tue, 25 Oct 2011 04:00:19 +0000 (-0400) Subject: Add bang patterns to the Misc module and use them to write a faster X-Git-Tag: 0.0.1~85 X-Git-Url: https://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=40a354da29b99d773fc18c4c4ad0d136a93d7264;p=spline3.git Add bang patterns to the Misc module and use them to write a faster factorial function (Ben Lippmeier). --- diff --git a/src/Misc.hs b/src/Misc.hs index b1cb1af..4b285e4 100644 --- a/src/Misc.hs +++ b/src/Misc.hs @@ -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.