3

私はこの形式で計算をしています: s -> a -> s、ここでsは何らかの状態のタイプです。このような関数の結果は、次の評価の状態でもあります。例えば、

appendInt :: String -> Int -> String
appendInt s i = s ++ (show i)

次に、appendInt "Int: " 1を与えますが"Int: 1"、 を(appendInt $ appendInt "Int: 1") 2与え"Int: 12"ます。Stateしかし、この種の計算をモナドに入れる方法が見つかりません。

最初の推測は ですがs -> (s,s)、次にa渡すことはできません。次に、 を試し(a -> s) -> (s, a -> s)ましたが、やはりsなしでは取得できませんa。出力ではなく入力であるs -> (a,s)ため、機能しません。a

では、この計算をどのようにラップすればよいでしょうか? モナドはStateこれに適していますか?

4

2 に答える 2

7

あなたはStateうまく使うことができます、あるいはもっとうまく使うことができますWriter

import Control.Monad.Writer
import Control.Monad.State

appendInt :: Int -> Writer String ()
appendInt i = tell $ show i

appendInt' :: Int -> State String ()
appendInt' i = modify (++ show i)

main = do print . execWriter $ do
            tell "Int: "
            appendInt 1
            appendInt 2
          print . flip execState "Int: " $ do
            appendInt' 1
            appendInt' 2
于 2015-10-08T07:16:49.570 に答える
3

たとえば、次のように、確かに可能です。

appendIntM :: MonadState String m => Int -> m ()
appendIntM i = modify $ flip appendInt i

引数の順序をより「慣習的」にしていたら、それはmodify.

Live On Coliru

于 2015-10-08T06:28:08.380 に答える