[Haskell-beginners] recursively building lists

Daniel Fischer daniel.is.fischer at web.de
Tue Dec 8 17:43:07 EST 2009


Am Dienstag 08 Dezember 2009 23:34:30 schrieb Torsten Otto:
> Hi!
>
> While trying to implement "words", we ran into the question of how to build
> lists of lists. The trouble boils down to this:
>
> test = []:[]
>
> is no problem, just as
>
> Prelude> []:[]:[]:[]
> [[],[],[]]
>
> works fine. Now trying to put the two together _is_ a problem:
>
> testlist 1 = []:[]
> testlist n = []:(testlist n-1)
>
>     No instance for (Num [[a]])
>       arising from a use of `testlist' at <interactive>:1:0-9
>     Possible fix: add an instance declaration for (Num [[a]])
>     In the expression: testlist 2
>     In the definition of `it': it = testlist 2
>
> Can someone please explain, what is going on here?

Yes. Function application has higher precedence than aritthmetic operations, so the RHS of 
testlist n is parsed as

[] : ( (testlist n) - 1)

So, by the equation for testlist 1, the compiler knows that

testlist :: (Num n) => n -> [[a]]

In the second equation, you try to subtract 1 from a value of type [[a]], that means you 
need a Num instance for that type.

What you want is

testlist n = []:testlist (n-1)

HTH,
Daniel


More information about the Beginners mailing list