私は理解を得るためにコードを作成しています。実際には、ソリティア ソルバーです。私は State モナドを使用する単純な力ずくの実装を持っています。実際には、それを使用できることを証明するためです (評価された各移動のカウントを保持するだけです)。しかし今、Unboxed Mutable 配列を使用して訪問したボードを記録し、別のパスを介して既に訪問したボードの位置に到達したときにパスの評価を短縮したいと考えています。ST モナドでは暗黙の状態をスレッド化できないようですが、Mutable 配列にアクセスするには ST (または IO) を使用する必要があります。だから私は2つのモナドを組み合わせる必要があるようです - 状態をスレッド化する状態(実際にはミュータブル配列を含みます)とミュータブル配列関数を得る別のモナド(ST)。
- これは正しいですか?
- もしそうなら、(標準的な?) Data.Array.ST/Control.Monad.ST/Control.Monad.ST と mtl の組み合わせよりも優れた代替手段はありますか?
- もし私がこの方法をとった場合、ST と State をどの順序でスタックするかは重要ですか?
- モナドトランスフォーマーの使用を避けるために、ST または State のいずれかまたは両方に基づいて独自の単一のモナドをローリングすることを検討する必要がありますか?