我对Haskell比较新,我想了解如何使用符号按顺序执行不同的动作。 特别是,我写一个程序,以基准算法(函数)如何在Haskell中强制进行评估?
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所需时间的正确方法吗?
换句话说,在执行动作end <- getCPUTime
之前,表达式foo inputList
会被完全减少吗?或者r
只会绑定到thunk foo inputList
?
更一般来说,如何确保在执行某个操作之前完全评估表达式?
这个问题被问得几个月前程序员(见here),并已被接受的答案有,但因为它属于对堆栈溢出它已关闭的题外话。这个问题不能转移到堆栈溢出,因为它超过了60天。所以,根据协调人的协议,我在这里重新发布这个问题,并自己发布接受的问题,因为我认为它包含一些有用的信息。
如果你是在基准有兴趣,你可能要检查出[标准](http://hackage.haskell.org/package/criterion ) 图书馆。 – hugomg
到达最后一行时,'foo'功能将不会执行。 Haskell函数只按需求进行评估,所以在赋值到'end'之前,你需要用'r'值做一些事情。 –