2014-05-02 42 views
0

这个问题可能有点傻,但我好心承担打印的格式的元组值

我正打算打印一个元组作为

String1 - 10 

Sritng2 - 20 

String3 - 30 

但如果我

putStrLn $ show(tuples) 

这是给我输出为[(“String”,10),(“String”,20),(“String”,30)]

回答

1

Show实例旨在将数据转换为可以使用Read实例直接解析回数据类型的字符串。如果你想要做这样的事情,你需要编写自己的漂亮的打印功能:

pprintTuple :: (Show a, Show b) => (a, b) -> String 
pprintTuple (a, b) = show a ++ " - " ++ show b 

有了这个功能,你可以将每个元组转换为字符串,然后在同一时间使用putStrLn打印那些出一行和mapM_

mapM_ putStrLn $ map pprintTuple tuples 

mapM_就像map,但它的工作原理与一元函数,也扔掉任何返回值。由于putStrLn不会返回除()以外的值,因此您想在此处使用它。

1

show和您的预期输出的输出中,看起来这是你想要什么:

putTuples ts = mapM_ putStrLn $ zipWith showTuple ts [1..] 
    where 
     showTuple (str, num) seq = str ++ show seq ++ " - " ++ show num 

测试:

> let ts = [("String",10),("String",20),("String",30)] 
> putTuples ts 
String1 - 10 
String2 - 20 
String3 - 30 
1

还有另一种方式来打印这提供了更多的元组控制但需要导入Text.Printf

例如:

> let xs = [("String1",10),("String2",20),("String3",30)] 
> mapM_ (\(x, y) -> printf "%s - %d\n" x y) xs 
String1 - 10 
String2 - 20 
String3 - 30 

您当然可以将lambda命名为函数。 我发现它有用的时候,有很多打印。