diff --git a/Data/SVM.hs b/Data/SVM.hs
--- a/Data/SVM.hs
+++ b/Data/SVM.hs
@@ -20,7 +20,7 @@
   ) where
 
 import           Control.Exception
-import           Control.Monad         (liftM, when)
+import           Control.Monad         (when)
 import           Data.IntMap           (IntMap, toList)
 import qualified Data.IntMap           as M
 import           Data.SVM.Raw          (CSvmModel, CSvmNode (..), CSvmParameter,
@@ -122,7 +122,7 @@
 newCSvmProblem :: Problem -> IO (Ptr CSvmProblem)
 newCSvmProblem lvs = do nodePtrList <- mapM (newCSvmNodeArray . snd) lvs
                         nodePtrPtr  <- newArray nodePtrList
-                        labelPtr <- newArray . map realToFrac $ map fst lvs
+                        labelPtr <- newArray (map (realToFrac . fst) lvs)
                         let z = fromIntegral . length $ lvs
                         ptr <- malloc
                         poke ptr $ CSvmProblem z labelPtr nodePtrPtr
@@ -185,12 +185,12 @@
 crossValidate' extra algo kern prob nFold =
     withProblem prob $ \probPtr ->
     withParam extra algo kern $ \paramPtr -> do
-        probLen <- (fromIntegral . R.l) `liftM` peek probPtr
+        probLen <- (fromIntegral . R.l) `fmap` peek probPtr
         allocaArray probLen $ \targetPtr -> do -- (length prob is inefficient)
             checkParam probPtr paramPtr
             let c_nFold = fromIntegral nFold
             c_svm_cross_validation probPtr paramPtr c_nFold targetPtr
-            map realToFrac `liftM` peekArray probLen targetPtr
+            map realToFrac `fmap` peekArray probLen targetPtr
 
 -- |Stratified cross validation
 crossValidate :: Algorithm -> KernelType -> Problem -> Int -> IO [Double]
@@ -210,15 +210,14 @@
 loadModel :: FilePath -> IO Model
 loadModel path = do
     modelPtr <- c_svm_load_model =<< newCString path
-    Model `liftM` newForeignPtr c_svm_destroy_model modelPtr
+    Model `fmap` newForeignPtr c_svm_destroy_model modelPtr
 
 -- |Predict a value for 'Vector' by using 'Model'
 predict :: Model -> Vector -> IO Double
 predict (Model modelForeignPtr) vector = action
     where action :: IO Double
           action = withForeignPtr modelForeignPtr $ \modelPtr ->
-                   withCSvmNodeArray vector $ \vectorPtr ->
-                        realToFrac <$> c_svm_predict modelPtr vectorPtr
+                   withCSvmNodeArray vector (fmap realToFrac . c_svm_predict modelPtr)
 
 -- |Wrapper to change the libsvm output reporting function.
 --
diff --git a/HSvm.cabal b/HSvm.cabal
--- a/HSvm.cabal
+++ b/HSvm.cabal
@@ -1,30 +1,30 @@
+Cabal-Version:      2.2
 Name:               HSvm
-Version:            0.1.1.3.25
+Version:            0.1.2.3.25
 Copyright:          (c) 2009 Paolo Losi, 2017 Pavel Ryzhov
 Maintainer:         Pavel Ryzhov <paul@paulrz.cz>
-License:            BSD3
+License:            BSD-3-Clause
 License-File:       LICENSE
 Author:             Paolo Losi <paolo.losi@gmail.com>
 Category:           Datamining, Classification
 Synopsis:           Haskell Bindings for libsvm
+Description:        The library embeds libsvm and provides a type-safe interface into SVM models.
 Stability:          provisional
 Build-Type:         Simple
-Cabal-Version:      >= 1.10
 Extra-Source-Files: cbits/svm.cpp cbits/svm.h
-Description:        The library embeds libsvm and provides a type-safe interface into SVM models.
 
 source-repository head
   type:             git
   location:         https://github.com/paulrzcz/HSvm.git
 
 Library
-  Default-language: Haskell2010
+  Default-Language: Haskell2010
   Build-Depends:    base >= 4 && < 5
-                  , containers
+                  , containers >= 0.6.7 && < 0.7
   Exposed-modules:  Data.SVM
                   , Data.SVM.Raw
   Includes:         svm.h
   Include-Dirs:     cbits
-  C-Sources:        cbits/svm.cpp
+  CXX-Sources:        cbits/svm.cpp
   Extra-Libraries:  stdc++
   Ghc-Options:      -Wall
