7

ReaderT r (Rand StdGen) a現在、並行して実行したい計算を行っています。私はMonadParallelに出くわしましたが、それは私が望むことを実行するようです。

のMonadParallelのインスタンスはすでに存在しますが、monad -randomからReaderT独自のインスタンスを作成する必要がありました。しかし、私はそれを正しく行ったかどうかはわかりません。Haskellでの並列プログラミングについてはあまり詳しくありませんが、並列で計算を実行すると、通常の実行時と同じ値が得られると期待されています。私のbindM2forRandのインスタンスは使用しているため(したがって、同じ初期ジェネレーターから異なる乱数のセットを取得します)、これは私のインスタンスには当てはまりません。Randsplit

instance P.MonadParallel (Rand StdGen) where
    bindM2 f ma mb = do
        split1 <- getSplit
        split2 <- getSplit
        let a = evalRand ma split1
        let b = evalRand mb split2
        a `par` b `pseq` f a b

これを無視することもあると思いますが(数字はまだランダムですよね?)、何かが足りないと感じずにはいられません。これは大丈夫ですか、それともより良い解決策がありますか?

4

2 に答える 2

2

私の主な懸念は、これが次の保証に違反していることです。

副作用の可能な順序は別として、この関数は次と同等です\f ma mb-> do {a <- ma; b <- mb; f a b}

これらは異なる結果になります:

let g = mkStdGen 0
    r = evalRand (do x <- getRandom
                     y <- getRandom
                     return (x, y)) g

let g = mkStdGen 0
    r = evalRand (P.bindM2 (\x y -> return (x,y)) getRandom getRandom) g

splitこれは、 、疑似乱数、および純粋性に関する乱数の性質に関する興味深い疑問を提起します。インスタンスが悪影響を与えるケースを想像するのは難しいですが、ソフトウェア システムの複雑さに驚かされることはありません。bindM2そのため、たとえ乱数であっても、についての期待に違反することはありません。

于 2013-01-30T08:28:40.120 に答える
1

には固有MonadParallelの問題がありbindM2ます。そのドキュメントには次のように記載されています。

2 つのモナド計算を並行して実行します。両方が終了したら、結果を関数に渡します。副作用の可能な順序は別として、この関数は次と同等です\f ma mb-> do {a <- ma; b <- mb; f a b}

問題は、モナド計算では (アプリカティブ ファンクターとは異なり)値がエフェクトとその順序に依存する可能性があることです。したがって、この要件はあまり意味がありません。検討

do
  a <- getCurrentTime -- from Date.Time
  b <- getCurrentTime
  return (a <= b)

これは常にTrueを返しますが、効果を並べ替えると を返し始めますFalse。明らかに、2 つの計算を並列化すると、非常に非決定論的な結果が得られます。

そのため、 の意図を解釈するのは困難ですbindM2MonadParallelのインスタンスを 2 つのカテゴリに分けることができると思います。

  1. 本当に決定論的で、bindM2が常に に等しいもの\f ma mb-> do {a <- ma; b <- mb; f a b}。つまり、効果の順序は変わりません。これらの実装は通常par、プログラムのセマンティクスを変更せず、一部の部分のみを並行して実行する を使用して定義されます。
  2. 効果の順序付けに依存するものは、したがって、bindM2と任意に異なる可能性があります\f ma mb-> do {a <- ma; b <- mb; f a b}。現在、そのようなインスタンスは、計算の 1 つに新しいスレッドを生成するためIOに使用される のみのようです。forkIO

したがってbindM2、有効なインスタンスとして受け入れるかどうかは、ドキュメントをどのように解釈するかによって異なります。(2.) を無効と見なす場合、実装も無効です (また、拒否する必要がありますIO)。(2.)が正しいと解釈すれば、気にする必要はありません。

于 2013-01-30T13:04:24.653 に答える