这个问题可能有点傻,但我好心承担打印的格式的元组值
我正打算打印一个元组作为
String1 - 10
Sritng2 - 20
String3 - 30
但如果我
putStrLn $ show(tuples)
这是给我输出为[(“String”,10),(“String”,20),(“String”,30)]
这个问题可能有点傻,但我好心承担打印的格式的元组值
我正打算打印一个元组作为
String1 - 10
Sritng2 - 20
String3 - 30
但如果我
putStrLn $ show(tuples)
这是给我输出为[(“String”,10),(“String”,20),(“String”,30)]
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
不会返回除()
以外的值,因此您想在此处使用它。
据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
还有另一种方式来打印这提供了更多的元组控制但需要导入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命名为函数。 我发现它有用的时候,有很多打印。