Мне нужно пометить двоичное дерево через обход первого порядка по глубине, и я подумал, что мне нужно сначала пройти через левые ветви дерева и назовите их, затем сделайте то же самое для правильных ветвей. Моя бинарное дерево хранит только значения на внутренних узлах (не конечных узлов/листьев):Haskell наклеивает двоичное дерево через сквозной сквозной ход по глубине
label :: MonadState m Int => Tree a -> m (Tree (Int, a))
label (Branch l x r) = do n <- get
l' <- label l
r' <- label r
return (Branch l' (n, x) r')
label (Leaf) = return Leaf
* EDIT: Необходимо использовать государство Монадой однако я действительно не схватывая использование этого. Мой текущий код показан выше, но не работает должным образом.
EDIT: желаемый результат, например. для:
Branch (Branch Leaf (-2) Leaf) 1 Leaf
должно быть:
Branch (Branch Leaf (0,-2) Leaf) (1,1) Leaf
Кроме того, я не знаю, как я должен использовать государство Монада для него, я еще совсем запутался для его использования:
instance Monad (State' s) where
-- return :: a -> State' s a
return x = State' (\(s,c) -> (x, s, (c <> oneReturn)))
-- (>>=) :: State' s a -> (a -> State' s b) -> State' s b
st >>= k = State' $ \(s,c) -> let (a, s', c') = runState' st (s,c)
in runState' (k a) (s',(c' <> oneBind))
instance MonadState (State' s) s where
-- get :: State' s s
get = State' $ \(s,c) -> (s,s, (c <> oneGet))
-- put :: s -> State' s()
put s = State' $ \(_,c) -> ((),s, (c <> onePut))
Вы отредактировали версию, отлично выглядящую, за исключением того, что она только считывает состояние, но не обновляет его с добавочным значением, поэтому все ваши ветви заканчиваются тем же ярлыком. – shang
Что это за тип 'Tree'? Желаете ли вы совершить посадку или послепорядок? – dfeuer