Another fold question

Patty Fong patty_jf at
Thu Nov 6 04:27:31 EST 2003

Having struglled over this for the better part of a day and only becoming 
more frustrated the more i try to understand it, i once again seek help :)

I understand how basic folds work, i.e foldr replaces (:) with some 
parameter and [] by another i.e
foldr (+) 0 [1,2,3] becomes 1+(2+(3+0))

I also understand how to write my own fold function. What i don't understand 
quite is how to use them. given this data type and this fold function i 

data Music
	= Note Pitch Octave Duration
	| Silence Duration
	| PlayerPar Music Music
	| PlayerSeq Music Music
	| Tempo (Ratio Int) Music
data Pitch = Cf | C | Cs
type Octave = Int
type Duration = Ratio Int

foldMusic :: (Pitch -> Octave -> Duration -> a)
	-> (Duration -> a)
	-> (a -> a -> a)
	-> (a -> a -> a)
	-> (Ratio Int -> a -> a)
	-> Music
	-> a

foldMusic n _ _ _ _ (Note pitch octive duration) = n pitch octive duration
foldMusic _ s _ _ _ (Silence duration) = s duration
foldMusic n s p1 p2 t (PlayerPar partOne partTwo) = p1 (foldMusic n s p1 p2 
t partOne)(foldMusic n s p1 p2 t partTwo)
foldMusic n s p1 p2 t (PlayerPar partA partB) = p2 (foldMusic n s p1 p2 t 
partA)(foldMusic n s p1 p2 t partB)
foldMusic n s p1 p2 t (Tempo rate part) = t rate (foldMusic n s p1 p2 t 

I understand that when i use the foldMusic function i need to pass it 5 
parameters.  given the type signiature, why can i pass (+) as a parameter 
for p1 but not for n, what determines what can be passed as a parameter, 
because they all have the return type a??

I attempted to create a function that utilises the foldMusic function that 
counts the number of notes:

count_notes :: Music -> Integer
count_notes = foldMusic (\_-> \_ -> \_ -> 1) (\_ -> 0) (+) (+) (\_ -> \_ -> 

it appears to work, i think. Yet i'm still not certain of how it does so.

This confuses me,
Is there anyway to represent other fold functions in a tree like 
representation as foldr (+) 0 would appear as such?
   1 \
     2 \
       3 \

confused Patrick

Hot chart ringtones and polyphonics. Go to

More information about the Haskell-Cafe mailing list