私はエルムのモナドの欠如に苦しんでいます。 Elm(http://package.elm-lang.org/packages/folkertdev/elm-state/latest/State)のための状態モナドを実装する図書館は私をかなり助けました。Elmで結果と状態を結合するにはどうすればよいですか?
問題は、それぞれが1つしか持たないときに、結果のタイプと状態タイプが交互に入れ子になっている状況に遭遇したことです。
次のシグネチャで関数を記述しようとしましたが、不可能なように見えます。内部状態は、外部状態が評価されて初めてわかるためです。私は、戻り値に州内の検索結果を置けば
join : Result a (State s (Result a (State s x))) -> Result a (State s x)
は、多分それは動作しますが、それは外の結果が
Err
である場合にはダミーの状態が生成されます。
正しいアイデアは、結果と状態の両方を作ることだと思います。ハスケルのモナド変圧器に精通している人が、このような問題をどのように解決するか、代替の解決法を提案する方法を説明できますか?ここで
は、問題が発生し、一箇所の大まかなバージョンです:
generateConstraints environment value
|> Result.map (State.map (\(value, valueC) ->
Result.map
(State.map2 (\this (body, bodyC) ->
(this
, valueC++ bodyC++ [(this, body)]
))
freshTypevar)
(generateConstraints (extend environment name value) body))
)
モナドトランスは、同じタイプのトランスを混在させると苦労します。私は典型的にはモナド型メらを使用していますが、タイプが複数回現れると失敗します。そのためのソリューションは、必要な特定のコンテキストを新しいタイプにすることです。 –
私は本当に同じモナドを何度も持っている必要はありません。私が含むコードスニペットは 'generateConstraints'の1つのケースです。これは' Result String(State Int(Type、List Constraint)) 'を返します。再帰はうまくいきますが、束縛のための制約生成とは異なるものがあります。 – Joonazan
私はまだ状態を持ち合わせている可能性があり、誤っている可能性はありますが、例外的な結果をすべて外に出すことができたので、奇跡的に解決した例があります。 – Joonazan