Я хочу построить монаду недетерминированного состояния в 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]
, но, в конце концов, как только я оборачиваю ветви монады списка в обёртку состояния, я не могу её удалить, верно? Так есть ли способ сделать это?
Спасибо.
primitives
? - person mhwombat   schedule 12.12.2012LogicT (State Int) Element
. Честные союзы, условные предложения и обрезка в качестве бонуса. Более эффективная реализация, чем простой список. - person Ed'ka   schedule 13.12.2012