2016-04-12 3 views
0

私はinorderでナンバリングツリーを書いています。ご覧のとおり、putを使用しました。ここでwithStateを使用できますか?haskell - putの代わりにwithStateを使用する

renumberTree2Inorder :: Tree a -> StateT Int Identity (Tree Int) 
renumberTree2Inorder Empty = return Empty 
renumberTree2Inorder (Node _ l r) = (renumberTree2Inorder l) >>= (\l' -> 
     get >>= (\i -> put (i + 1) >>= (\_ -> renumberTree2Inorder r) >>= (\r' -> return (Node i l' r')))) 



renumberTree2Inorder' :: Tree a -> Tree Int 
renumberTree2Inorder' t = evalState (renumberTree2Inorder t) 0 

答えて

1

はい。ここでwithStateは次のようになります。

renumberTree2Inorder :: Tree a -> StateT Int Identity (Tree Int) 
renumberTree2Inorder Empty = 
    return Empty 
renumberTree2Inorder (Node _ l r) = do 
    l' <- renumberTree2Inorder l 
    i <- get 
    withState (+ 1) $ do 
    r' <- renumberTree2Inorder r 
    return (Node i l' r') 

あなたはまだあなたが最後にNodeを構築することができi <- getを必要としています。

+0

この 'withState'の使用は意味がありません。あなたは単に' get'で呼び出すようにします。正確に 'modify(+1)>> get'です。おそらく、再帰的な場合に 'withState'が適用されるはずです。 – user2407038

+0

ああ、そう。一定! – hao