评估任何(... - > IO())函数的函数

Ale*_*har 1 lambda haskell

在main中几个函数输出信息.

我需要测量他们的执行时间.

目前它是这样做的:

  start <- getCurrentTime
  putStrLn $ show $ findNthMinLinear (getTestArrayOfLength (read arrlength :: Int)) 4
  stop <- getCurrentTime
  print $ diffUTCTime stop start
Run Code Online (Sandbox Code Playgroud)

我想将每个函数包装在一个函数中,该函数记住时间2.评估函数3.记住时间4.打印两次记忆时间之间的差异

问题是我不知道如何在不首先评估它的情况下传递函数.

我的猜测是,如果我写(<5)例如,那就是我创建一个返回函数的函数,直到我传递最终参数我才会做真正的工作吗?然后我可以写

printAndMeasure :: (a -> IO()) -> IO ()
...
printAndMeasure \x -> (getTestArrayOfLength (read arrlength :: Int)) 4
Run Code Online (Sandbox Code Playgroud)

但这是一个草率的解决方案,因为我不需要这个x,除了保持执行功能.

Sat*_*vik 6

传递函数不会对其进行评估.所以你可以有类似的功能IO () -> IO ()并将IO动作传递给它们.当程序运行时,只main执行函数并且在需要之前不评估函数的参数(懒惰).如果您尝试对代码进行基准测试,那么最好使用基准测试库Criterion.