我是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:

10-08 12:48