Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 功能重复计时_Haskell_Monads_Timing - Fatal编程技术网

Haskell 功能重复计时

Haskell 功能重复计时,haskell,monads,timing,Haskell,Monads,Timing,我有一个非常简单的函数f::Int->Int,我想编写一个程序,为每个n=1,2,…,max调用f。每次调用f后,应显示截至该点的(累计)使用时间(以及n和fn)。如何实现这一点 我对Haskell中的输入/输出还很陌生,所以这就是我到目前为止所尝试的(使用一些玩具示例函数f) 我不太明白我该如何在这里介绍时间。(时间的Int可能需要替换为其他内容。)您可能需要这样的内容。根据递归函数的需要调整以下基本示例 import Data.Time.Clock import Control.Except

我有一个非常简单的函数
f::Int->Int
,我想编写一个程序,为每个
n=1,2,…,max
调用
f
。每次调用
f
后,应显示截至该点的(累计)使用时间(以及
n
fn
)。如何实现这一点

我对Haskell中的输入/输出还很陌生,所以这就是我到目前为止所尝试的(使用一些玩具示例函数
f


我不太明白我该如何在这里介绍时间。(时间
Int
可能需要替换为其他内容。)

您可能需要这样的内容。根据递归函数的需要调整以下基本示例

import Data.Time.Clock
import Control.Exception (evaluate)

main :: IO ()
main = do
  putStrLn "Enter a number"
  n <- readLn
  start <- getCurrentTime
  let fact = product [1..n] :: Integer
  evaluate fact  -- this is needed, otherwise laziness would postpone the evaluation
  end <- getCurrentTime
  putStrLn $ "Time elapsed: " ++ show (diffUTCTime end start)
  -- putStrLn $ "The result was " ++ show fact
导入数据.Time.Clock
导入控制。异常(评估)
main::IO()
main=do
putStrLn“输入一个数字”

我终于找到了解决办法。在这种情况下,我们测量的是以毫秒为单位的“实时”

import Data.Time
import Data.Time.Clock.POSIX

f n = sum[0..n]

getTime = getCurrentTime >>= pure . (1000*) . utcTimeToPOSIXSeconds >>= pure . round

main = do 
    maxns <- getLine 
    let maxn = (read maxns)::Int
    t0 <- getTime 
    loop 1 maxn t0
     where loop n maxn t0|n==maxn = return ()
           loop n maxn t0
             = do 
                 putStrLn $ "fun eval: " ++ (show n) ++ ", " ++ (show $ (f n)) 
                 t <- getTime
                 putStrLn $ "time: " ++ show (t-t0); 
                 loop (n+1) maxn t0
导入数据。时间
导入Data.Time.Clock.POSIX
fn=总和[0..n]
getTime=getCurrentTime>>=pure。(1000*) . utcTimeToPOSIXSeconds>>=纯。圆形的
main=do

maxns最好将基准测试委托给一个专门的工具,例如,谢谢你的链接!现在这对我来说似乎有点太难了,所以我想在使用像这样的库之前,我仍然会尝试坚持一种基本的方法,因为我想学习如何做到这样的想法。在一种懒惰的语言中,很难正确地进行基准测试,而且是双重的。如果你想要准确的结果,我不建议你自己滚动。我可能应该强调的是,这不是为了获得准确的基准测试结果,而是为了学习如何使用这些单子而构建的一个示例,因为它们对我来说仍然很难理解。到目前为止,我已经找到了类似的片段,但是如果你想测量所有
n=1,2,…,max
的时间,而不仅仅是一段
n
,我不知道如何应用这个,所以你需要对那些
n
进行某种
循环,但这就是我被卡住的地方。@probler但是你自己的代码使用递归进行这样的循环。这可能不是最好的款式,但很管用。我将在代码中介绍对
getCurrentTime
的调用。
import Data.Time
import Data.Time.Clock.POSIX

f n = sum[0..n]

getTime = getCurrentTime >>= pure . (1000*) . utcTimeToPOSIXSeconds >>= pure . round

main = do 
    maxns <- getLine 
    let maxn = (read maxns)::Int
    t0 <- getTime 
    loop 1 maxn t0
     where loop n maxn t0|n==maxn = return ()
           loop n maxn t0
             = do 
                 putStrLn $ "fun eval: " ++ (show n) ++ ", " ++ (show $ (f n)) 
                 t <- getTime
                 putStrLn $ "time: " ++ show (t-t0); 
                 loop (n+1) maxn t0