我是Haskell的新手,我试图学习如何使用do表示法依次执行不同的 Action 。
特别是,我正在编写一个程序来对算法(函数)进行基准测试
foo :: [String] -> [String]
为此,我想编写一个类似
import System.CPUTime
benchmark :: [String] -> IO Integer
benchmark inputList = do
start <- getCPUTime
let r = foo inputList
end <- getCPUTime
return (end - start) -- Possible conversion needed.
最后一行可能需要转换(例如,转换为毫秒),但这不是此问题的主题。
这是测量某些参数inputList上计算函数foo所需时间的正确方法吗?
换句话说,在执行 Action
foo inputList
之前,表达式end <- getCPUTime
是否会完全减少?还是r
仅绑定(bind)到thunk foo inputList
?更一般而言,如何确保在执行某些操作之前对表达式进行完全求值?
几个月前,这个问题是在程序员那里提出的(请参阅here),并在此处得到了可接受的答案,但由于属于堆栈溢出问题,因此已被关闭为题外。该问题已超过60天,因此无法移至堆栈溢出。因此,与主持人同意,我将问题重新发布到此处,并亲自发布已接受的问题,因为我认为该问题包含一些有用的信息。
最佳答案
最初由用户ysdx给出的答案on programmers: