Haskell 如何使用“putStrLn”打印多行字符串?
我正在用Haskell编写一个非常简单的程序,它要求用户输入一个名称,然后根据该名称显示一些文本。我可以让程序工作,但我想在用户输入我的猫的名字时显示猫的ASCII图片。我想要像这样的东西Haskell 如何使用“putStrLn”打印多行字符串?,haskell,Haskell,我正在用Haskell编写一个非常简单的程序,它要求用户输入一个名称,然后根据该名称显示一些文本。我可以让程序工作,但我想在用户输入我的猫的名字时显示猫的ASCII图片。我想要像这样的东西 ^ - ^ ( . . ) =>;<= / \ | | ^-^ ( . . ) =>; Lee问“计算机以什么方式不起作用?”你的回答是: if name == "cat" then putStrLn (" ^ - ^
^ - ^
( . . )
=>;<=
/ \
| |
^-^
( . . )
=>; Lee问“计算机以什么方式不起作用?”你的回答是:
if name == "cat"
then putStrLn (" ^ - ^
( . . )
=>;<=
/ \
| |")
这是因为在Haskell字符串文本中不能有换行符。Haskell中的多行字符串需要特殊的转义(每行开头和结尾的反斜杠)。您的ascii艺术中已经有一个未转义的反斜杠,该反斜杠本应转义,因此我们也将解决此问题:
test name =
if name == "cat"
then putStrLn (" ^ - ^\n\
\ ( . . )\n\
\ =>;<=\n\
\ / \\\n\
\ | |")
或者,您可以对更漂亮的多行字符串使用准引号。这需要字符串qq
包和准Quotes语言扩展。该扩展具有语法[| | |]
,字符串qq包为字符串提供名为s
的引号:
{-# LANGUAGE QuasiQuotes #-}
import Data.String.QQ
import Control.Monad (when)
test2 name =
when (name == "cat") $ putStrLn [s|
^ - ^
( . . )
=>;<=
/ \\
| ||]
{-#语言准语言}
导入Data.String.QQ
导入控制.Monad(何时)
test2名称=
当(名称==“cat”)$putStrLn[s|
^ - ^
( . . )
=>;这是另一种选择,我有时会用到:
putStr $ unlines
[ " ^ - ^"
, " ( . . )"
, " =>;<="
, " / \\"
, " | |"
]
putStrLn
以什么方式不起作用?@Lee我编辑了这个问题以显示我的天真尝试。我可以让你的第二个示例起作用。谢谢。当我尝试你的第三个示例时,我被告知它找不到模块Data.String。QQ@JoeJohnson126你是不是先安装了stringqq
软件包?我没有。我会设法弄清楚怎么做这是我学习编程的头几天。
test name =
if name == "cat"
then putStrLn (" ^ - ^\n\
\ ( . . )\n\
\ =>;<=\n\
\ / \\\n\
\ | |")
else return ()
{-# LANGUAGE QuasiQuotes #-}
import Data.String.QQ
import Control.Monad (when)
test2 name =
when (name == "cat") $ putStrLn [s|
^ - ^
( . . )
=>;<=
/ \\
| ||]
putStr $ unlines
[ " ^ - ^"
, " ( . . )"
, " =>;<="
, " / \\"
, " | |"
]
> unlines ["abc", "def", "ghi"]
"abc\ndef\nghi\n"