[Haskell-cafe] Re: zip3, zip4 ... -> zipn?

Per Vognsen per.vognsen at gmail.com
Sat Aug 11 11:51:35 EDT 2007


On 8/11/07, apfelmus <apfelmus at quantentunnel.de> wrote:
> Frank Buss schrieb:
> > Is it possible to write a function like this:
> >
> > zipn n list_1 list_2 list_3 ... list_n
> >
> > which implements zip3 for n=3, zip4 for n=4 etc.? Looks like variable number
> > of arguments are possible, like printf shows, so a general zipn should be
> > possible, too. If it is possible, why there are functions like zip5 and not
> > just zipn?
>
> What type would this function have? It's not possible to formulate this
> type in Haskell98. The problem is that the number of arguments cannot be
> determined statically, i.e. it depends on the value of  n  at run-time.
> There are languages more freaky than Haskell (like Agda or Epigram )
> that can do that (without dynamic typing, that is!), they are called
> "dependently typed".
>
> However, type-class hackery (or type synonym families once they're
> available in GHC) can be used to do something like that if you give the
> value of n at compile-time. I won't dwell into that, though.
>
> Also, applicative functors can help
>
>    GHCi> :m +Control.Applicative
>    GHCi> (\x y z -> x*(y+z)) <$> ZipList [1,2,3]
>          <*> ZipList [-1,0,1] <*> ZipList [1,1,1]
>    ZipList [0,2,6]
>    GHCi>
>
> (the second command is a single line.)

Applicative functors can indeed help:

    (,,,) <$> [1,2,3] <*> [-1,0,1] <*> [1,1,1] <*> [0,2,6]

You just use n-1 commas when you want the effect of zipn.

-Per


More information about the Haskell-Cafe mailing list