[Haskell-beginners] Re: Defeating type inference

Will Ness will_n48 at yahoo.com
Fri Feb 27 17:59:05 EST 2009

Philip Scott <pscott <at> foo.me.uk> writes:

> Hi Alex,
> > The problem is that when you go fro
> >> months = range (Jan,Dec) : months
> >> realmonths = concat months
> >>     

Another way to go about this is to always look at types. You've correctly 
surmised that you have to refer back to the name you're defining, months, in a 
recusive definition, so let's write it down as 
  months = range (Jan,Dec) `somehowJoinWith` months

What is somehowJoinWith's type? Its first argument is [Month], let's call it 
[a]. So
 somehowJoinWith :: [a] -> b -> b

But you want its result to be a list of Month's too. So b = [a] and
 somehowJoinWith :: [a] -> [a] -> [a]

Cons (:) simply won't fit here, as it is :: a -> [a] -> [a].

(++) OTOH does fit, and is exactly what you need.

Thinking with types helps clarify the problem always. It helps us not to 
confuse oranges and boxes-of-oranges. :)


More information about the Beginners mailing list