[Haskell-cafe] apply function arguments in a list

Neil Brown nccb2 at kent.ac.uk
Mon Oct 5 10:43:49 EDT 2009


Michael Mossey wrote:
> If I have a list containing the arguments I want to give to a 
> function, is there a general way to supply those arguments in a 
> compact syntax?
>
> In other words, I could have
>
> args = [1,2,3]
> f x y z = ...
>
> I would write
>
> t = f (args!!0) (args!!1) (args!!2)
>
> but there may be a neater, more general syntax.
In general, the problem is that you can't guarantee ahead of time that 
the list will have three elements, so however you write it, you'll turn 
a compile-time error (wrong number of args to function) into a run-time 
error (!! says index is invalid).  The neatest way is probably:

t [x,y,z] = f x y z

Which will give a slightly better error if the list is the wrong size.  
If your function takes many arguments of the same type, perhaps you 
could generalise it to take a list of arbitrary size, and do away with 
requiring three arguments?  Alternatively, use tuples if you want an 
easy way to carry the arguments around together:

args = (1, 2, 3)
f x y z = ...

uncurry3 f (x,y,z) = f x y z

t = uncurry3 f

(uncurry already exists, I think uncurry3 is one you have to add yourself).

Neil.


More information about the Haskell-Cafe mailing list