1

私は主に情報を出力するいくつかの機能を持っています。

彼らの実行時間を測定する必要があります。

現在、次のように実行されています。

  start <- getCurrentTime
  putStrLn $ show $ findNthMinLinear (getTestArrayOfLength (read arrlength :: Int)) 4
  stop <- getCurrentTime
  print $ diffUTCTime stop start

各関数を次の関数でラップしたい1.時間を記憶する2.関数を評価する3.時間を記憶する4.2つの記憶された時間の差を出力する

問題は、最初に関数を評価せずに関数を渡す方法がわからないことです。

私の推測では、たとえば(<5)と書いた場合、つまり関数を返す関数を作成した場合、最終的なパラメーターを渡すまで実際の作業は行われませんか?それから私は書くことができます

printAndMeasure :: (a -> IO()) -> IO ()
...
printAndMeasure \x -> (getTestArrayOfLength (read arrlength :: Int)) 4

しかし、関数が実行されないようにする以外にこのxは本当に必要ないので、これはずさんな解決策です。

4

1 に答える 1

6

関数を渡すことはそれを評価しません。したがって、のような機能を持ち、アクションをそれらにIO () -> IO ()渡すことができます。IOプログラムが実行mainされると、関数のみが実行され、関数の引数は必要になるまで評価されません(怠惰)。コードをベンチマークしようとしている場合は、のようなベンチマークライブラリを使用することをお勧めしますCriterion

于 2012-11-02T13:42:26.697 に答える