haskell中的标记树
我有一个任意的树,想把它转换成一个整数树,原始值应该被整数替换。每次出现时,必须用相同的数字替换相同的值 提供了遍历树的函数,这是我的标签函数haskell中的标记树,haskell,tree,monads,state-monad,Haskell,Tree,Monads,State Monad,我有一个任意的树,想把它转换成一个整数树,原始值应该被整数替换。每次出现时,必须用相同的数字替换相同的值 提供了遍历树的函数,这是我的标签函数 label :: Ord a => a -> State (Store a Int) Int 我相信我需要一个堆栈来存储标签,但我不知道如何应用它 ,如果您有遍历功能,请提供任何指导 traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a ->
label :: Ord a => a -> State (Store a Int) Int
我相信我需要一个堆栈来存储标签,但我不知道如何应用它
,如果您有遍历功能,请提供任何指导
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
正如Traversable
typeclass所给出的,那么您就有了f~状态(存储一个Int)
,所以
traverse label :: (Ord a, Traversable t) => t a -> State (Store a Int) (t Int)
因此,您应该能够将遍历标签
应用于您的树,然后执行该状态操作以获取您的标签树,这样就完全可以了
labelTree :: (Tree t, Ord a) => t a -> Store a Int -> (t Int, Store a Int)
labelTree tree labelStore = runState (traverse label tree) labelStore
我提供了labelStore
作为参数,因为可能需要为该函数提供一组现有的标签,并且不清楚如何构造新的存储
然而,我要指出的是,即使在这里使用树也没有什么特别之处,任何
可遍历的就足够了,因此您可以将其应用于列表、映射s、自定义类型,或者其他什么,只要它是一个可遍历的容器,其中包含Ord a=>a
值。如果您有遍历函数
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
正如Traversable
typeclass所给出的,那么您就有了f~状态(存储一个Int)
,所以
traverse label :: (Ord a, Traversable t) => t a -> State (Store a Int) (t Int)
因此,您应该能够将遍历标签
应用于您的树,然后执行该状态操作以获取您的标签树,这样就完全可以了
labelTree :: (Tree t, Ord a) => t a -> Store a Int -> (t Int, Store a Int)
labelTree tree labelStore = runState (traverse label tree) labelStore
我提供了labelStore
作为参数,因为可能需要为该函数提供一组现有的标签,并且不清楚如何构造新的存储
然而,我要指出的是,即使在这里使用树也没有什么特别的,任何可遍历的就足够了,因此您可以将其应用于列表、映射s、自定义类型,或者其他任何东西,只要它是一个可遍历的容器,其中包含Ord a=>a
值。堆栈在这里不合适,但是看起来Store
是一种映射类型,处理一段数据到一个整数的映射。堆栈在这里不合适,但看起来Store
是一种映射类型,处理一段数据到一个整数的映射。