1

次のような単純な状態のセットがあります。

st1 = [("x", 2), ("y", 3), ("z", 3)]

値が変わるため、プログラムの実行時にこれを更新したいと思います。次のような更新コードがあります。

update str val st = (str, val) : foldr step [] st where
    step x acc
        | fst x == str = acc
        | otherwise = x:acc

次のような割り当て関数を作成したいと思います。

assign (str, val) env = update str val env

私が抱えている問題は、Haskell には副作用がないため、更新されたリストが更新されないことです。これを行う方法に関するアイデアや提案はありますか?

インタープリターを入力すると

let st2 = update "x" 1 st1

次に、新しい状態が保存されます。

関数でこれを行いたい:

update "x"  1 st1

Before:   [("x",1),("y",3),("z",3)]

After:    [("y",1),("x",2),("z",3)]
4

1 に答える 1

2

すでに述べたように、Haskell で副作用を起こすことはできません。代わりに、複数のlet式 (またはその他の種類の定義) を使用できます。

let st2 = update "x" 1 st1
let st3 = update "y" 2 st2

これにはState Monadと呼ばれる 1 つの方法がありますが、その概念は自明ではないため、今のところ掘り下げることはお勧めしません。代わりに、haskell のチュートリアルまたは本を読み始めることをお勧めします。チュートリアルの後の章の状態モナド。または、両方のオプションよりも優れているのは、自分で状態モナドを発明することです (思ったより簡単です)。

于 2012-11-28T12:37:23.957 に答える