【发布时间】:2018-05-22 16:26:52
【问题描述】:
我是 Haskell 的新手,在整个 IO 方面确实遇到了麻烦。
我试图找出在haskell中遍历一个列表需要多长时间。我想生成一个随机数列表并将其作为参数传递给函数,以便我可以打印列表中的每个元素。我正在使用 CRITERION 包进行基准测试。代码如下:
{-# LANGUAGE OverloadedStrings #-}
import System.Random
import Control.Exception
import Criterion.Main
printElements [] = return ()
printElements (x:xs) = do print(x)
printElements xs
randomList 0 = return []
randomList n = do
x <- randomRIO (1,100)
xs <- randomList (n-1)
return (x:xs)
main = defaultMain [
bgroup "printElements" [ bench "[1,2,3]" $ whnf printElements (randomList 10)
, bench "[4,5,6]" $ whnf printElements [4,5,6,4,2,5]
, bench "[7,8,9]" $ whnf printElements [7,8,9,2,3,4]
, bench "[10,11,12]" $ whnf printElements [10,11, 12,4,5]
]
]
运行代码时出错:
listtraversal.hs:18:67:
Couldn't match expected type ‘[a0]’ with actual type ‘IO [t0]’
In the second argument of ‘whnf’, namely ‘(randomList 10)’
In the second argument of ‘($)’, namely
‘whnf printElements (randomList 10)’
【问题讨论】:
-
尝试给每个函数一个明确的类型签名。这是一个很好的练习,既能在这个学习阶段提供信息,又有助于在 Haskell 学习/使用的所有阶段本地化编译消息。
-
在基准测试期间,您将重复执行
printElements foo以获取一些foo。您希望foo在每次执行中都不同吗? -
顺便说一句,使用此基准,您将主要衡量打印内容所需的时间,因为相比之下生成随机数和遍历列表所需的时间可以忽略不计。
标签: list haskell benchmarking io-monad criterion