使用criterion库我想要使用Monad m => a -> m b
类型对函数进行基准测试。
以下是来自jsaddle库的 JSM monad的典型示例:
import Criterion.Main
import JSDOM.Types (JSM)
import GHCJS.Buffer (Buffer(..))
import qualified Data.ByteString as BS (ByteString)
main :: IO ()
main = defaultMain [
bgroup "Image" [ bench "buildBS" $ nf buildBS 256
, bench "toJsBuff" $ nfIO (toJsBuff img)
] ]
img :: BS.ByteString
img = id $! buildBS 256
buildBS :: Int -> BS.ByteString
buildBS = undefined
toJsBuff :: BS.ByteString -> JSM Buffer
toJsBuff bs = undefined
现在这不能编译,因为函数nfIO
仅适用于IO monad而不适用于任何monad。
如何对这样的monadic函数进行基准测试?
注意:当我使用nf
而不是nfIO
时,还会出现编译时错误。