如何在Haskell中正确打印换行?

15

我想为月度教程制作一个井字棋游戏,首先编写了以下代码以制作一个方框:

box :: [String]
box = ["0 | 1 | 2",
       "---------",
       "3 | 4 | 5",
       "---------",
       "6 | 7 | 8"]

我在 GHCi 中得到了这个输出:

["0 | 1 | 2\n","---------\n","3 | 4 | 5\n","---------\n","6 | 7 | 8\n"]

我想获得:

 0 | 1 | 2
 ---------
 3 | 4 | 5
 ---------
 6 | 7 | 8

我该如何打印出这样的网格?


1
你在使用什么函数输出它? - dave4420
我没有使用任何函数,而是在 GHCi 提示符下工作。 - Rog Matthews
2个回答

34

尝试像这样:

box = unlines $ ["0 | 1 | 2",
                 "---------",
                 "3 | 4 | 5",
                 "---------",
                 "6 | 7 | 8"]

然后使用 putStr 输出盒子:

main = putStr box

unlines 会取一个字符串列表,并使用换行符将它们连接起来。它本质上把字符串列表看作行的列表,然后将它们转换为单个字符串。

putStr 只是将字符串打印到标准输出(STDOUT)。如果你使用 print 或 GHCi 查看该字符串,则换行符将呈现为 \n 而不是实际的换行符。这是因为 Stringshow 实例被设计成序列化字符串,就像你输入它一样,而不是将其打印出来。在输出到 STDOUT 前,print 和 GHCi 都会使用 show

如果你在 GHCi 提示符下想要查看字符串的实际样子,你可以直接使用 putStr

*Main> putStr box
0 | 1 | 2
---------
3 | 4 | 5
---------
6 | 7 | 8
*Main>

@dave4420:哇,我没注意到!谢谢你修复我的错误。 - Tikhon Jelvis
1
不要感谢我,感谢我的失眠。你还可以通过始终使用 putStr/putStrLn 或者注意它们之间的区别来改进你的答案。 - dave4420
1
哦,说得好。我原本想一直使用 putStr,但是我太习惯用 putStrLn 了,所以凭本能就打出来了 :) - Tikhon Jelvis
@ Tikhon 请问有没有办法可以将 Maybe Int 的输入转换为 Int。我正在处理以下代码。code`moves = do` `putStrLn "请输入数字"` `number <- readLn :: IO Int` `print number` `findposition number box = findIndex (==number) box :: Int` - Rog Matthews
1
@user:你应该为此提出一个新问题。 - ehird
@user 当您提出新问题时,请不要忘记说明当“Maybe Int”为“Nothing”时您希望发生什么。 - dave4420

8
另一种方法是:
main = mapM_ putStrLn box

mapM :: Monad m => (a -> m b) -> [a] -> m [b] 是 map 的变种,用于 monadic 函数。它的下划线版 mapM_ :: Monad m => (a -> m b) -> [a] -> m () 不收集返回值,因此可更高效。如果返回值不重要,例如对于 putStrLn smapM_ 更佳。


@ Daniel 请问有没有办法可以将 Maybe Int 的输入转换为 Int。我正在处理以下代码。code`moves = do` `putStrLn "请输入数字"` `number <- readLn :: IO Int` `print number` `findposition number box = findIndex (==number) box :: Int` - Rog Matthews
1
如果您对“Nothing”情况有一个合理的默认值,请使用maybe :: b -> (a -> b) -> Maybe a -> bData.Maybe.fromMaybe :: a -> Maybe a -> a - Daniel Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接