1
我已经定义了一个代表一棵树的新数据类型。我还实现了一个函数walk
来遍历树的所有元素,函数的功能版本是正确的,但不是他的monadic版本walkM
。如何遍历具有Haskell monadic函数的树的元素?
module Hdot where
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
data RDoll a = Null | RDoll a [RDoll a] deriving (Show)
test :: RDoll Int
test = RDoll 1 [RDoll 2 [Null], RDoll 3 [RDoll 4 [Null]]]
walk :: (a -> b) -> RDoll a -> [b]
walk f Null = []
walk f (RDoll x rds) = ((f x): (concatMap (\x -> walk f x) rds))
walkM :: (Monad m) => (a -> m b) -> RDoll a -> m [b]
walkM f Null = return []
walkM f (RDoll rd rdss) = do
x <- f rd
xs <- concatMap (walkM f) rdss
return (x:xs)
有一种类型的错误
Couldn't match type `b' with `[b]'
...
有人可以帮我!
感谢您的任何答复。
非常感谢Don Stewart! – 2012-04-26 12:04:34
再次感谢你,对于我在'RDolld'上做的事情,这真的很有帮助。 – 2012-04-26 12:15:57