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

ben*_*wad 4 haskell

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

FirstString : SecondString

FirstString : SecondString
Run Code Online (Sandbox Code Playgroud)

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

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

有什么我做错了吗?

bdo*_*lan 10

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

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

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

  • 如果关注内存,您可能需要查看newacct的方法(如下所示). (2认同)

new*_*cct 8

你甚至可以使用mapM:

display :: Table -> IO ()
display = mapM_ (\(a,b) -> putStrLn (a++" = "++b))
Run Code Online (Sandbox Code Playgroud)


Tom*_*rst 6

我同意你应该将你的代码分成两个函数:

  • 一个纯粹的部分:一个使用你的数据结构,并把它变成一个字符串的函数
  • 一个不纯的部分,将该字符串呈现给控制台

这是一个简单的实现:

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

display :: Table -> IO ()
display table = putStr (showTable table)
Run Code Online (Sandbox Code Playgroud)

这种设计有两个优点:

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

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