Haskellで非決定論的な状態モナドを構築したいと思います。これにより、ビルドアップ状態を使用して検索スペース内のすべての要素を生成し、不良な場所を取り除くことができます。次の(擬似)コードがあるとします。
primitives :: [State Int Element]
primitives = [... list of primitive stateful elements ...]
combine :: Element -> Element -> State Int Element
expand :: Depth -> [State Int Element]
expand 0 = primitives
expand d = do
... do something to the state ...
left <- expand (d-1)
right <- expand (d-1)
let out = combine left right
guard ( ... some check on out ... )
return out
ここで機能しないことがいくつかあります。私が理解する必要がある最も基本的なことは、何かを述べてから、それを各expand
ブランチにパイプする方法です。型の関数を使ってさまざまな方法を試しましたState Int [ State Int Element]
が、最終的には、リストモナドのブランチを状態ラッパーでラップすると、削除できなくなります。それで、これを行う方法はありますか?
ありがとう。