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?
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)]