[Haskell-beginners] Traverse tree with computing current level using Foldable instance.
Chaddaï Fouché
chaddai.fouche at gmail.com
Wed May 23 18:48:27 CEST 2012
On Wed, May 23, 2012 at 12:51 PM, Dmitriy Matrosov <sgf.dma at gmail.com> wrote:
> On 05/22/12 06:18, Brent Yorgey wrote:
>> However, you should be able to define a general fold for Tape, with
>> type
>>
>> foldTape :: (a -> [b] -> b) -> Tape a -> b
>>
So, you wrote it correctly :
> foldTape :: (a -> [b] -> b) -> Tape a -> b
> foldTape f (Tape x ts) = f x (map (foldTape f) ts)
This appears desperate since there's no mention of Int anywhere in
this function and the function applied stay the same whatever the
level : the initially given f parameter.
But there's a trick to this, we'll have to treat some of our type
variable like functions, here only b can vary freely (a is imposed by
the Tape a inputted), so let's see what it looks like if we make it a
functional type (with Int parameter):
> foldTape :: (a -> [Int -> b] -> (Int -> b)) -> Tape a -> (Int -> b)
much more promising wouldn't you say ? The solution now looks like that :
> foldTapeD :: (Monoid m) => (Int -> a -> m) -> Tape a -> m
> foldTapeD f t = (foldTape go t) 0
> where
> go x fs n = ....
I let you write your solution (if you didn't find before tomorrow
evening, I'll give you the answer).
You can then call foldTapeD thus :
> foldTapeD (\n x -> if n < 2 then [x] else []) testTape
(much nicer than your initial solution, is it not ?)
--
Jedaï
More information about the Beginners
mailing list