Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯凯尔';无法将类型[]与IO匹配_Haskell_Types_Match_Main_Quicksort - Fatal编程技术网

Haskell 哈斯凯尔';无法将类型[]与IO匹配

Haskell 哈斯凯尔';无法将类型[]与IO匹配,haskell,types,match,main,quicksort,Haskell,Types,Match,Main,Quicksort,我是哈斯克尔的新人。为什么我会收到错误消息 (无法将以下代码中的类型“[]”与“IO'-Haskell”匹配) 大体上,我只需要算法运行的时间,没有结果 只想测量算法时间 qsort1 :: Ord a => [a] -> [a] qsort1 [] = [] qsort1 (p:xs) = qsort1 lesser ++ [p] ++ qsort1 greater where lesser = [ y | y <- xs, y < p

我是哈斯克尔的新人。为什么我会收到错误消息

(无法将以下代码中的类型“[]”与“IO'-Haskell”匹配)

大体上,我只需要算法运行的时间,没有结果

只想测量算法时间

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) 
qsort1::Ord a=>[a]->[a]
qsort1[]=[]
qsort1(p:xs)=qsort1小+++[p]++qsort1大
哪里

lesser=[y | y您的
main
函数不正确。除非
qsort1
是一个
IO
操作,否则您不能在IO monad中执行它。相反,您可以将它放在let绑定中:

main = do
    start <- getCurrentTime
    let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
    end <- getCurrentTime
    print (diffUTCTime end start) 
相反,您可以使用它来计算:

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


正如@kosmikus指出的那样,
BangPatterns
不会导致全面评估。相反,使用像
Criteria
这样的库,它是专门为Benchmarking设计的。

我使用了下面的方法,效果很好:

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

谢谢。问题是现在我没有得到算法时间,但得到了算法时间和打印时间。@MatejKr我已经更新了答案,不使用打印,而是使用Bang运算符强制计算。@MatejKr Put
{-#LANGUAGE BangPatterns}
在您的文件顶部。bang模式在此处不正确。它不会强制进行完全评估,也不会导致正确的结果。只需使用类似基准测试的标准,而不是尝试重新设计轮子。因为bang模式通常不会导致完全评估,而只评估到弱头范式。qsort1 ret列出一个列表。
main = do
    start <- getCurrentTime
    let !x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
    end <- getCurrentTime
    print (diffUTCTime end start)   
main = do
        let arr = take 1000000 $ randomRs ((1 :: Int), 10000000) (mkStdGen 59)
        defaultMain [
          bgroup "qs" [ bench "1"  $ nf quickSort arr ]
          ]