1

Haskell と STM は初めてで、基本概念を理解しようとしています。

Haskell と関数型プログラミング全般では、間違っていたら訂正してください。割り当てのようなものはありません。

私ができることは、 andx=3;を使用して別のバインディングを生成することだけです。x3

TVar とスレッドに関して言えば、同じ TVar を共有する多数のスレッドがある場合、1 つのスレッドが で値を変更するとwriteTVar、他のスレッドは変更された値を認識します。

同じ var を共有する 2 つのスレッドがTVar Intあり、最初のスレッドがそれに 1 を追加すると、成功した場合、2 番目のスレッドは更新された値を参照しますか?

タクス

4

2 に答える 2

3

TVar変数ではなく、読み書きできるチャネルを考えたほうがよいかもしれません。

純粋な変数は、常に何らかの値を返す純粋な関数と見なすことができます(この値は、例のように一度だけバインドされます)。モナド内の変数/関数には、その値を変更する可能性のある「コンテキスト」(モナドの目的) があります (たとえばrandomIO :: Random a => IO a、 fromSystem.Randomは「モナド値」と見なされる可能性があり、値は任意の呼び出しで変更される可能性があります)。

読み取りと書き込みTVarは、純粋ではない明示的な操作です。そのため、関数 readTVar/writeTVarはモナドにラップさSTMれます。それらは、結果を変更する可能性のある隠しコンテキストに依存します (スレッド間で値の転送を可能にします)。ただし、これらの操作はモナドに制限されSTM、エスケープできるのはモナドIOのみです。

于 2013-01-05T15:35:18.760 に答える
3

はい、これTVarはコンテナーであり、内容が変更されても変更されません。すべてのスレッドは同じコンテナーを参照し、あるスレッドがコンテナーに格納された内容を変更すると、別のスレッドが参照すると、変更された値が検出されます。

于 2013-01-05T14:52:26.947 に答える