[Haskell-cafe] What is this function?

Luke Palmer lrpalmer at gmail.com
Thu Oct 16 05:39:55 EDT 2008


2008/10/16 John Ky <newhoggy at gmail.com>:
> Hi,
>
> I've written this function here:
>
>    scramble [] = []
>    scramble [x] = [[z] | z <- scramble x]
>    scramble (x:xs) =
>       [(y:z)|y <- scramble x, z <- scramble xs]
>
> and (I think) it roughly does what I want it to:
>
>    *Main> scramble ([]::[Int])
>    []
>    *Main> scramble ([1]::[Int])
>    [[1],[2]]

So, um, this is nonsense.  You've given it only 1, and yet it outputs
a 2, yet there is no mention of addition or the literal 2 anywhere in
your function.

This function looks a lot like the more sensible:

  scramble' n xs = sequence (replicate n xs)

>>> scramble' 0 [1,2,3]
[[]]
>>> scramble' 1 [1,2,3]
[[1],[2],[3]]
>>> scramble' 2 [1,2,3]
[[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]

Where your examples all had [1,2] as the argument.

Luke


More information about the Haskell-Cafe mailing list