[Haskell-beginners] Defeating type inference

Antoine Latter aslatter at gmail.com
Wed Feb 25 23:41:23 EST 2009


On Wed, Feb 25, 2009 at 6:18 PM, Philip Scott <pscott at foo.me.uk> wrote:
> Well, either that or I being an idiot.
>
> Here's a little example. Let us say you had a datatype 'Month'*
>
> data Month = Jan
>      |     Feb
>      |     Mar
>      |     Apr
>      |     May
>      |     Jun
>      |     Jul
>      |     Aug
>      |     Sep
>      |     Oct
>      |     Nov
>      |     Dec
>      deriving(Show, Eq, Ord, Ix)
<SNIP>
> months = concat (range (Jan, Dec) : months)
>
> Which should work, right**
>
> But the type checker is not pleased at all and complains:
>
>       Couldn't match expected type `[Month]'
>              against inferred type `Month'
>         Expected type: [[Month]]
>         Inferred type: [Month]
>       In the expression: concat (range (Jan, Dec) : months)
>       In the definition of `months':
>           months = concat (range (Jan, Dec) : months)
>
> However, if you use the first definition and make a second function:
>
> months = range (Jan, Dec) : months
> realmonths = concat(months)
>
> It is happy and does what one might expect. I thought perhaps I was just
> confusing the inference engine so I tried a liberal sprinkling of ::
> operators to make my intentions clear, but it still wasn't having any of it.
>

Can you post your version of the problem function which includes type
signatures?  Can you also write-out a top-level type signature for the
entire expression?

Antoine


More information about the Beginners mailing list