24

私の Haskell プログラムでは、printf を使用してタプルのリストをフォーマットしたいと考えています。リストに printf をマップして、次のように値を 1 つずつ出力できます。

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

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

私はこのようなことができるようにしたい:

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

ただし、これは 2 つの個別の値ではなく、タプルを printf に渡します。タプルをprintfの2つの引数に変換するにはどうすればよいですか?

4

3 に答える 3

47

Functionuncurryは、2 つの引数 (カリー化された) 関数をペアの関数に変換します。その型シグネチャは次のとおりです。

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

printf次のように で使用する必要があります。

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

別の解決策は、次のように、パターン マッチングを使用してタプルを分解することです。

mapM_ (\(a,b) -> printf "Values: %d %d\n" a b) [(1,100),(2,350),(3,600),(4,200)]
于 2011-02-25T14:01:49.347 に答える
3
mapM_ (\(x,y) -> printf "Value: %d %d\n" x y) [(1,100),(2,350),(3,600),(4,200)]
于 2011-02-25T14:06:29.507 に答える