I have the DataType
data Rose a = Leaf a | Node [Rose a]
an example would be:
fmfp = Node [Node [Leaf "F"], Node [], Node [Leaf "F", Leaf "P"], Leaf "M"]
which graphically looks like this:
I have learned how to (mechanically) write fold functions for different data types, and so I came up with this fold function:
foldRose :: (a -> r) -> ([r] -> r) -> Rose a -> r
foldRose fl fn Leaf a = fl a
foldRose fl fn Node a = fn (map (foldRose fl fn)) a
The thing is, I don't really understand WHAT it does. For example, if I had
foldRose id concat fmfp
what would it do exactly? Would it be
foldRose id concat fmfp = concat [concat [id "F"], concat [],
concat [id "F", id "P"], id "M"]
How do you wrap your mind around those kinds of functions? What do they intuitively mean? Also, how do I write a mapRose function, what would I have to think befre starting, what would it be supposed to do?
Just follow the steps, slowly and confidently.
data Rose a = Leaf a | Node [Rose a]
fmfp = Node [ Node [Leaf "F"]
, Node []
, Node [Leaf "F", Leaf "P"]
, Leaf "M" ]
foldRose ::
(a -> r) ->
([r] -> r) ->
Rose a -> r
foldRose fLeaf fNode (Leaf a ) = fLeaf a
foldRose fLeaf fNode (Node trees) = fNode (map (foldRose fLeaf fNode) trees)
( " r
" is for recursive result ).
Notice that you had few errors there, which I fixed in the above. Now,
foldRose id concat fmfp
= let fLeaf = id
fNode = concat
in
foldRose fLeaf fNode (Node [Node [Leaf "F"], Node [], Node [Leaf "F", Leaf "P"], Leaf "M"])
= fNode (map (foldRose fLeaf fNode)
[Node [Leaf "F"], Node [], Node [Leaf "F", Leaf "P"], Leaf "M"])
= fNode [
foldRose fLeaf fNode $ Node [Leaf "F"]
, foldRose fLeaf fNode $ Node []
, foldRose fLeaf fNode $ Node [Leaf "F", Leaf "P"]
, foldRose fLeaf fNode $ Leaf "M" ]
= fNode [
fNode $ map (foldRose fLeaf fNode) [Leaf "F"]
, fNode $ map (foldRose fLeaf fNode) []
, fNode $ map (foldRose fLeaf fNode) [Leaf "F", Leaf "P"]
, fLeaf $ "M" ]
= fNode [
fNode [ foldRose fLeaf fNode $ Leaf "F"]
, fNode []
, fNode [ foldRose fLeaf fNode $ Leaf "F", foldRose fLeaf fNode $ Leaf "P"]
, fLeaf "M" ]
= fNode [
fNode [ fLeaf "F"]
, fNode []
, fNode [ fLeaf "F", fLeaf "P"]
, fLeaf "M" ]
and that is simply
= concat [ concat [ id "F"]
, concat []
, concat [ id "F", id "P"]
, id "M"
]
= concat [ concat [ "F"], [], concat [ "F", "P"], "M" ]
= concat [ "F", "FP", "M" ]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.