Haskell - Failed to match type [] with IO

I am new to Haskell. Why am I getting an error

(Unable to match type '[]' with 'IO' - Haskell) in the following code.

Basically, I only need the running time of the algorithm with no result.

Only for measuring algorithm time.

qsort1 :: Ord a => [a] -> [a]
qsort1 []     = []
qsort1 (p:xs) = qsort1 lesser ++ [p] ++ qsort1 greater
    where
        lesser  = [ y | y <- xs, y < p ]
        greater = [ y | y <- xs, y >= p ]

main = do
    start <- getCurrentTime
    qsort1 (take 1000000 $ randomRs (1, 100000) (mkStdGen 42))
    end <- getCurrentTime
    print (diffUTCTime end start) 
+4
source share
2 answers

Your function mainis incorrect. If qsort1it is not an action IO, you cannot execute it in the IO monad. Instead, you can put it in a let binding:

main = do
    start <- getCurrentTime
    let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
    end <- getCurrentTime
    print (diffUTCTime end start) 

Also note that I explicitly gave a type annotation for 1to avoid some compilation errors.

, - . x , . main, , :

λ> main
0.000001s

, :

main = do
    start <- getCurrentTime
    let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
    print x
    end <- getCurrentTime
    print (diffUTCTime end start)  

BangPatterns qsort1:

main = do
    start <- getCurrentTime
    let !x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
    end <- getCurrentTime
    print (diffUTCTime end start)   

BangPatterns , @kosmikus. criterion, benchnmarking.

+5

, :

main = do
        let arr = take 1000000 $ randomRs ((1 :: Int), 10000000) (mkStdGen 59)
        defaultMain [
          bgroup "qs" [ bench "1"  $ nf quickSort arr ]
          ]
0

Source: https://habr.com/ru/post/1598399/


All Articles