2016-04-13 10 views
1

私は任意のツリーを持ち、それを整数のツリーに変換したいので、元の値を整数で置き換える必要があります。同じ値は、すべての発生時に同じ数に置き換えなければなりません。haskellのツリーにラベルを付ける

は、ツリーを横断するため

機能が提供され、これは私がラベルを格納するためのスタックを必要とすると信じて、私のラベリング機能

label :: Ord a => a -> State (Store a Int) Int 

ですが、私はそれ を適用するかどうかはわかりません、どんな指導は次のようになりますあなたはトラバーサル機能Traversable型クラスで与えられるように

traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) 

を持っているなら、あなたは、

+0

スタックはここでは適切ではありませんが、 'Store'は、あるデータを整数にマッピングする処理の一種です。 – chepner

答えて

5

に感謝ヘクタールそれは私が「

labelTree :: (Tree t, Ord a) => t a -> Store a Int -> (t Int, Store a Int) 
labelTree tree labelStore = runState (traverse label tree) labelStore 

だろう全額のでそうあなただけの、あなたのラベル付き木を取得するには、その状態のアクションを実行し、あなたのツリーにtraverse labelを適用することができるはずですので

traverse label :: (Ord a, Traversable t) => t a -> State (Store a Int) (t Int) 

f ~ State (Store a Int)ましこの関数に既存のラベルのセットを提供することが望ましい可能性があり、新しいStoreを構築する方法が明確ではないため、引数としてlabelStoreを指定しました。

しかし、私はどのTraversableは十分であろう、でもここに木を使用について特別な何もないことを指摘しますので、あなたはリスト、Map S、カスタム型、または任意にこれを適用することができ、それはTraversableコンテナの提供しましたOrd a => aの値を保持します。

関連する問題