Haskellは初めてです。エラーメッセージが表示されるのはなぜですか
(タイプ '[]'と 'IO' — Haskellを一致させることができませんでした)次のコードで。
主に、結果なしでアルゴリズムを実行する時間だけが必要です。
アルゴリズム時間のみを測定したい。
qsort1 :: Ord a => [a] -> [a]
qsort1 [] = []
qsort1 (p:xs) = qsort1 lesser ++ [p] ++ qsort1 greater
where
lesser = [ y | y <- xs, y < p ]
greater = [ y | y <- xs, y >= p ]
main = do
start <- getCurrentTime
qsort1 (take 1000000 $ randomRs (1, 100000) (mkStdGen 42))
end <- getCurrentTime
print (diffUTCTime end start)
あなたのmain
機能は正しくありません。ない限り、qsort1
あるIO
アクションは、あなたはIOモナドでそれを実行することはできません。代わりに、それをletバインディングに入れることができます。
main = do
start <- getCurrentTime
let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
end <- getCurrentTime
print (diffUTCTime end start)
また1
、コンパイルエラーを回避するために、型アノテーションを明示的に指定していることにも注意してください。
しかし、それでも、遅延評価のため、ソートにかかる合計時間を実際に見つけることはできません。x
プログラムで使用されることはないため、計算されることはありません。を実行するとmain
、明らかに間違っているこの出力が得られます。
λ> main
0.000001s
代わりに、これを使用して計算を計算できます。
main = do
start <- getCurrentTime
let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
print x
end <- getCurrentTime
print (diffUTCTime end start)
印刷する代わりに、BangPatterns
拡張子を使用してqsort1
:の計算を強制することもできます。
main = do
start <- getCurrentTime
let !x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
end <- getCurrentTime
print (diffUTCTime end start)
BangPatterns
@kosmikusが指摘しているように、完全な評価にはつながりません。代わりにcriterion
、ベンチマーク用に特別に作成されたようなライブラリを使用してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加