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