
Hi guys, I've tried to use Data.Tree as a computation tree (each node is numerical function, each leaf is a terminal) It kinda works, but the code seems very verbose. How can it made more concise ? I am sure I missed a lot of shortcuts and idioms. -- file t.hs import qualified Data.Tree as T data Term = TInt Int| TDouble Double deriving (Show, Eq) data Func = Plus | Minus | Mult | Div deriving (Show, Eq) data ANode = GFunc Func | GTerm Term deriving (Show, Eq) fNode :: Func -> T.Forest ANode-> T.Tree ANode fNode f = T.Node (GFunc f) tNode:: Term -> T.Tree ANode tNode t = T.Node (GTerm t) [] calc :: T.Tree ANode -> Double calc (T.Node (GTerm (TInt n))[]) = fromIntegral n :: Double calc (T.Node (GFunc Plus) xs ) = foldl1 (+) (map calc xs) calc (T.Node (GFunc Minus) xs ) = foldl1 (-) (map calc xs) calc (T.Node (GFunc Mult) xs ) = foldl1 (*) (map calc xs) calc (T.Node (GFunc Div) xs ) = foldl1 (/) (map calc xs) -- (/ (+ 5 5 (- 10 100)) 10) - calc Should return -8.0 aTree = fNode Div [fNode Plus [tNode $ TInt 5,tNode $ TInt 5, fNode Minus [tNode $ TInt 10,tNode $ TInt 100]], tNode (TInt 10)] Regards, Gabi http://bugspy.net