Haskell 哈斯凯尔';无法将类型[]与IO匹配
我是哈斯克尔的新人。为什么我会收到错误消息 (无法将以下代码中的类型“[]”与“IO'-Haskell”匹配) 大体上,我只需要算法运行的时间,没有结果 只想测量算法时间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
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 ]
]