Haskell:打印出元组列表的内容

时间:2009-05-05 02:02:55

标签: haskell

基本上我需要做的是编写一个函数,它接受类型[(String, String)]的列表并打印出内容,以便逐行输出如下所示:

FirstString : SecondString

FirstString : SecondString

..等,列表中的每个项目。我有以下代码并将其打印出来,但出于某种原因,它会在最后打印出包含[(),()]的行。

display :: Table -> IO ()
display zs = do { 
    xs <- sequence [putStrLn ( a ++ " = " ++ b) | (a, b) <- zs];
    print xs 
}

我有什么问题吗?

4 个答案:

答案 0 :(得分:10)

最终打印xs是不必要的。这里的序列返回一堆()s(putStrLn的返回值),print也打印出来。

当你正在使用它时,现在print xs已经消失,你可以摆脱xs变量绑定,并将序列转换为sequence_以丢弃返回值,给出:

display :: Table -> IO()
display zs = sequence_ [putStrLn (a++" = "++b) | (a,b) <- zs]

答案 1 :(得分:8)

您甚至可以使用mapM

display :: Table -> IO ()
display = mapM_ (\(a,b) -> putStrLn (a++" = "++b))

答案 2 :(得分:6)

我同意ja您应该将代码分成两个函数:

  • pure 部分:一个获取数据结构并将其转换为字符串的函数
  • impure 部分,将该字符串呈现给控制台

这是一个简单的实现:

showTable :: Table -> String
showTable xs = concatMap format xs
  where
    format (a, b) = a ++ " : " ++ b ++ "\n"

display :: Table -> IO ()
display table = putStr (showTable table)

这种设计有两个优点:

首先,你的大多数`逻辑'都在代码的纯粹部分,这很好,在函数编程方式。

其次,这只是简单的软件工程原理;如果您想在代码的另一部分格式化数据结构(似乎很可能),您现在可以使用可重用的函数。

答案 3 :(得分:4)

编写一个函数,将一个元组取一个字符串,格式化为你想要的 然后在你的列表上运行concatMap;打印结果。