2016-08-27 2 views
3

私はMonadState s mが私にsを取得し、更新する能力を与えることを理解します。MonadStateレンズコンバイナはいつ使用しますか?

しかし、私はこの状態がassignのようなレンズコンビネータで使用される状態にどのように関係しているのか分かりません。特に、レンズが複数のターゲットで動作できる場合。また、状態を必要としないsetのような単純な関数もあります。

これらの類似のコンビネータのそれぞれのユースケースは何ですか?

答えて

2

MonadStateの中でレンズを使用することに関するこの優れたブログ記事を読むことをお勧めします。ハスケルがどれほど素晴らしいことができるかの例を示しています。 assignsetとの違いについてのご質問については

http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html

assignMonadState内で動作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のように振る舞います。

関連する問題