Feed elements of a tuple to a function as arguments in Haskell?

davidscolgan picture davidscolgan · Feb 25, 2011 · Viewed 9k times · Source

In my Haskell program, I want to use printf to format a list of tuples. I can map printf over a list to print out the values one at a time like this:

mapM_ (printf "Value: %d\n") [1,2,3,4]

Value: 1
Value: 2
Value: 3
Value: 4

I want to be able to do something like this:

mapM_ (printf "Values: %d %d\n") [(1,100),(2,350),(3,600),(4,200)]

Values: 1 100
Values: 2 350
Values: 3 600
Values: 4 200

But this passes a tuple to printf, not two separate values. How can I turn the tuple into two arguments for printf?

Answer

Miikka picture Miikka · Feb 25, 2011

Function uncurry converts a two-argument (curried) function into a function on pairs. Here's its type signature:

uncurry :: (a -> b -> c) -> (a, b) -> c

You need to use it on printf, like this:

mapM_ (uncurry $ printf "Values: %d %d\n") [(1,100),(2,350),(3,600),(4,200)]

Another solution is to use pattern matching to deconstruct the tuple, like this:

mapM_ (\(a,b) -> printf "Values: %d %d\n" a b) [(1,100),(2,350),(3,600),(4,200)]