12

Int乱数生成のシードとして使用する sが必要なので、システム時間をシードとして使用するという古いトリックを使用したかったのです。

そこで、Data.Time パッケージを使用しようとしたところ、次のことができました。

import Data.Time.Clock

time = getCurrentTime >>= return . utctDayTime

時間を実行すると、次のようなものが得られます。

Prelude Data.Time.Clock> time
55712.00536s

の型はtimeですIO DiffTimeIO Somethingこれはプログラムの外部のものに依存するため、型が表示されることを期待していました。だから私は2つの質問があります:

a) 何らかの方法で IO をアンラップして、基になる DiffTime 値を取得することは可能ですか?

b) DiffTime を秒単位の値を持つ整数に変換するにはどうすればよいですか? 関数secondsToDiffTimeはありますが、その逆が見つかりませんでした。

4

4 に答える 4

17

何らかの方法で IO をアンラップして、基になる DiffTime 値を取得することは可能ですか?

はい。その方法を説明するモナドに関するチュートリアルは数多くあります。それらはすべて、何かを受け取って実行する (たとえば return ) または単に を返す関数を作成するという考えに基づいています。だから、あなたが持っているなら、あなたは書くDiffTimeIO ()Answerf :: DiffTime -> Answer

time >>= \t -> return (f t)

一部の人々はそれを書くことを好みます

time >>= (return . f) 

そして、あなたが持っているなら、あなたは持っていcontinue :: DiffTime -> IO ()ます

time >>= continue

doまたは、表記法を好むかもしれません:

do { t <- time
   ; continue t  -- or possibly return (f t)
   }

詳細については、モナドに関する多くの優れたチュートリアルの 1 つを参照してください。

于 2010-01-21T16:04:56.013 に答える
9

System.Random乱数生成に標準モジュールを使用することを計画している場合は、時間依存シードが初期化されたジェネレーターがすでに存在します。を呼び出すことで取得できますgetStdGen :: IO StdGen。(もちろん、結果を使用するには、質問のパート(a)に対する回答が必要です。)

于 2010-01-21T16:43:08.307 に答える
9

a) もちろん、DiffTime値を取得することは可能です。そうでなければ、この関数は意味がありません。モナドについて読む必要があります。Real World Haskell のこの章次の章には、適切な紹介があります。

b)ドキュメントはDiffTime、それがクラスのインスタンスであると述べていますReal。つまり、実数、この場合は秒数として扱うことができます。したがって、それを秒に変換することは、変換関数を連鎖させるという単純な問題です。

diffTimeToSeconds :: DiffTime -> Integer
diffTimeToSeconds = floor . toRational
于 2010-01-21T15:39:03.567 に答える
1

この機能は、OPが要求するものとは正確には異なります。しかし、それは便利です:

λ: import Data.Time.Clock
λ: let getSeconds = getCurrentTime >>= return . fromRational . toRational . utctDayTime
λ: :i getSeconds 
getSeconds :: IO Double     -- Defined at <interactive>:56:5
λ: getSeconds 
57577.607162
λ: getSeconds 
57578.902397
λ: getSeconds 
57580.387334
于 2014-06-16T16:00:34.997 に答える