Haskell - 无法将类型 [] 与 IO 匹配

标签 haskell types match main quicksort

我是 Haskell 的新手。为什么我收到错误消息

(Couldn't match type '[]' with 'IO' — Haskell) in folowing code.



主要我只需要运行算法的时间而没有结果。

只想测量算法时间。
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) 

最佳答案

您的 main功能不对。除非qsort1IO您无法在 IO monad 中执行的操作。相反,您可以将其放在 let 绑定(bind)中:

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

另请注意,我已经明确给出了 1 的类型注释。以避免一些编译错误。

但是话虽如此,由于惰性评估,您实际上无法找到进行排序所花费的总时间。 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 这样的库。这是专门为基准测试而设计的。

关于Haskell - 无法将类型 [] 与 IO 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31479433/

相关文章:

haskell - 使用 Vim 在文本换行上自动继续 Haskell 注释中的前导破折号

list - Haskell - 连接字符串列表

javascript - 我很困惑名称是什么数据类型?函数数据类型或 boolean 数据类型,因为它会返回 boolean 值?

c++ - 如何用不同的数据类型调用同一个函数?

java - 如何匹配多个捕获组,但结果不符合预期

haskell - 来自数据类型的 Show 实例的错误

haskell - 模拟 Wreq 响应

SQL 获取 '= ALL' 样式的行

c - OpenGL GLint,GLsizei 限制?

SQLite:一个单词中的FTS匹配可以忽略哪个字符