私はMonadState s m
が私にs
を取得し、更新する能力を与えることを理解します。MonadStateレンズコンバイナはいつ使用しますか?
しかし、私はこの状態がassignのようなレンズコンビネータで使用される状態にどのように関係しているのか分かりません。特に、レンズが複数のターゲットで動作できる場合。また、状態を必要としないsetのような単純な関数もあります。
これらの類似のコンビネータのそれぞれのユースケースは何ですか?
私はMonadState s m
が私にs
を取得し、更新する能力を与えることを理解します。MonadStateレンズコンバイナはいつ使用しますか?
しかし、私はこの状態がassignのようなレンズコンビネータで使用される状態にどのように関係しているのか分かりません。特に、レンズが複数のターゲットで動作できる場合。また、状態を必要としないsetのような単純な関数もあります。
これらの類似のコンビネータのそれぞれのユースケースは何ですか?
MonadState
の中でレンズを使用することに関するこの優れたブログ記事を読むことをお勧めします。ハスケルがどれほど素晴らしいことができるかの例を示しています。 assign
とset
との違いについてのご質問については
http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html
:assign
はMonadState
内で動作set
だけのバージョンです。それでおしまい。この事実は実装によって観察できます。
いくつかの例を挙げておきます。
ghci> set _2 42 ([0.1, 0.2], 3)
([0.1,0.2],42)
あなたがassign
を使用する場合は、いくつかのState
コンテキスト内で、この関数を呼び出す必要があります。
あなたは、いくつかのオブジェクトの一部フィールドは(繰り返しのために申し訳ありません)だけを設定しset
を使用することができます。
ghci> execStateT (assignMe 42) ([0.1,0.2], 3)
before assignment: ([0.1,0.2],3)
after assignment: ([0.1,0.2],42)
([0.1,0.2],42)
それだ:あなたは今、あなたがその実行の結果を観察することができGHCiの中でこの関数を呼び出した場合
assignMe :: Int -> StateT ([Double], Int) IO()
assignMe x = do
before <- get
liftIO $ putStrLn $ "before assignment: " ++ show before
assign _2 x
after <- get
liftIO $ putStrLn $ "after assignment: " ++ show after
:たとえば、次の簡単な関数を考えます。 assign
は、レンズを州に適用する点を除いて、set
のように振る舞います。