以下のステートフル命令コードをHaskellに変換しようとしています。ブレークの種類が異なるステートフルループ
while (true) {
while (get()) {
if (put1()) {
failImmediately();
}
}
if (put2()) {
succeedImmediately();
}
}
両方put1
とput2
システムの状態を読み取り、それを修正します。 get
は簡単に状態を読み取ることができます。 failImmediately
はエンドレスループから抜け出し、あるタイプの結果を提示する必要があります。succeedImmediately
もまた別の結果を提示する必要があります。私が使用しようとした何
Env
は、環境の状態を表現してResult
は、いくつかのカスタムFailure
とSuccess
ためEither Failure Success
のようなものだったState Env Result
ました。
結果の表現全体がFailure
/Success
に折りたたまれ、そのうちの1つが生成されたら(ループを壊す)、そうでなければ続行する必要があるという苦労があります。私が持っていた
ひとつのアイデアは、Either Exit()
どこdata Exit = Success | Failure
を使用し、すなわち、任意の後続のアクションを無視して、チェーンされたモナドたEither
かのようにEither
のLeft
時に動作するように何とかStateT
を使用しました。
上記のスニペットと同じ動作を実現するヒントやヒントのサンプルをいただきありがとうございます。
編集:洗練されたバージョンを別の質問 "Stateful computation with different types of short-circuit (Maybe, Either)"に移動しました。
あなたは([ 'EitherT(国家のEnv結果)']になっているはずですhttps://hackage.haskell.org/package/either-4.4.1/docs/Control-M onad-Trans-Either.html)。そのヒントが十分ではなく、もっと詳細が必要な場合は教えてください:) – Cactus
私はこのシナリオでそれを使用する方法を少ししか考えていないことを除いて、これが私が必要とするかもしれない感じを得る:(もしあなたが – jakubdaniel