diff --git a/Hungarian-Munkres.cabal b/Hungarian-Munkres.cabal
--- a/Hungarian-Munkres.cabal
+++ b/Hungarian-Munkres.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                Hungarian-Munkres
-version:             0.1.4
+version:             0.1.5
 synopsis:            A Linear Sum Assignment Problem (LSAP) solver
 description:         This library provide a Haskell binding to the libhungarian,
                      a solver for Linear Sum Assignment Problem (LSAP) implemented
@@ -25,7 +25,7 @@
   exposed-modules:     Algorithms.Hungarian
   -- other-modules:       
   -- other-extensions:    
-  build-depends:       base >=4.7 && <4.8
+  build-depends:       base >=4.0 && <5.0
   hs-source-dirs:      src
   c-sources:           cbits/hungarian.c
   include-dirs:        include
@@ -38,7 +38,7 @@
   main-is:             bench.hs
   default-language:    Haskell2010
   build-depends:
-      base >=4.7 && <4.8
+      base >=4.0 && <5.0
     , array
     , Hungarian-Munkres
     , Munkres
@@ -51,7 +51,7 @@
   main-is:             tests.hs
   default-language:    Haskell2010
   build-depends:
-      base >=4.7 && <4.8
+      base >=4.0 && <5.0
     , array
     , Hungarian-Munkres
     , Munkres
diff --git a/benchmarks/bench.hs b/benchmarks/bench.hs
--- a/benchmarks/bench.hs
+++ b/benchmarks/bench.hs
@@ -5,7 +5,7 @@
 import System.Random
 
 sample :: [Double]
-sample = take 4000 $ randomRs (-100, 100) (mkStdGen 4)
+sample = take 2000 $ randomRs (-100, 100) (mkStdGen 4)
 
 sample' :: [Double]
 sample' = take 40000 $ randomRs (-1000, 1000) (mkStdGen 24)
diff --git a/src/Algorithms/Hungarian.hs b/src/Algorithms/Hungarian.hs
--- a/src/Algorithms/Hungarian.hs
+++ b/src/Algorithms/Hungarian.hs
@@ -1,9 +1,10 @@
 {-# LANGUAGE ForeignFunctionInterface #-}
-{-# LANGUAGE EmptyDataDecls #-}
 
 module Algorithms.Hungarian 
     ( hungarian
     , hungarianScore
+    , unsafeHungarian
+    , unsafeHungarianScore
     ) where
 
 import Data.List
@@ -14,12 +15,32 @@
 foreign import ccall "hungarian"
     c_hungarian :: Ptr CDouble -> CInt -> CInt -> Ptr CSize -> Ptr CSize -> IO Double
 
--- | solve the LSAP by hungarian algorithm, return assignment and score
+-- | solve the LSAP by hungarian algorithm, return assignment and score.
 hungarian :: [Double]               -- ^ row majored flat matrix
           -> Int                    -- ^ number of rows
           -> Int                    -- ^ number of columns
           -> ([(Int, Int)], Double)
-hungarian costMatrix rows cols = unsafePerformIO $ do
+hungarian costMatrix rows cols
+    | length costMatrix /= rows * cols = error "Algorithms.Hungarian.hungarian: incorrect size"
+    | otherwise = unsafeHungarian costMatrix rows cols
+{-# INLINE hungarian #-}
+
+-- | solve the LSAP by hungarian algorithm, return score only
+hungarianScore :: [Double] -> Int -> Int -> Double
+hungarianScore costMatrix rows cols
+    | length costMatrix /= rows * cols = error "Algorithms.Hungarian.hungarian: incorrect size"
+    | otherwise = unsafePerformIO $ do
+        withArray (map realToFrac costMatrix) $ \input -> do
+            fmap realToFrac $ c_hungarian input (fromIntegral rows)
+                                          (fromIntegral cols) nullPtr nullPtr
+{-# INLINE hungarianScore #-}
+
+-- | doesn't check if the input is a valid matrix
+unsafeHungarian :: [Double]               -- ^ row majored flat matrix
+                -> Int                    -- ^ number of rows
+                -> Int                    -- ^ number of columns
+                -> ([(Int, Int)], Double)
+unsafeHungarian costMatrix rows cols = unsafePerformIO $ do
     withArray (map realToFrac costMatrix) $ \input -> 
         allocaArray n $ \from -> allocaArray n $ \to -> do
             cost <- c_hungarian input (fromIntegral rows) (fromIntegral cols)
@@ -30,12 +51,12 @@
   where
     f x y = (fromIntegral x, fromIntegral y)
     n = min rows cols
-{-# INLINE hungarian #-}
+{-# INLINE unsafeHungarian #-}
 
 -- | solve the LSAP by hungarian algorithm, return score only
-hungarianScore :: [Double] -> Int -> Int -> Double
-hungarianScore costMatrix rows cols = unsafePerformIO $ do
+unsafeHungarianScore :: [Double] -> Int -> Int -> Double
+unsafeHungarianScore costMatrix rows cols = unsafePerformIO $ do
     withArray (map realToFrac costMatrix) $ \input -> do
         fmap realToFrac $ c_hungarian input (fromIntegral rows)
                                       (fromIntegral cols) nullPtr nullPtr
-{-# INLINE hungarianScore #-}
+{-# INLINE unsafeHungarianScore #-}
