Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何使用“putStrLn”打印多行字符串?_Haskell - Fatal编程技术网

Haskell 如何使用“putStrLn”打印多行字符串?

Haskell 如何使用“putStrLn”打印多行字符串?,haskell,Haskell,我正在用Haskell编写一个非常简单的程序,它要求用户输入一个名称,然后根据该名称显示一些文本。我可以让程序工作,但我想在用户输入我的猫的名字时显示猫的ASCII图片。我想要像这样的东西 ^ - ^ ( . . ) =>;<= / \ | | ^-^ ( . . ) =>; Lee问“计算机以什么方式不起作用?”你的回答是: if name == "cat" then putStrLn (" ^ - ^

我正在用Haskell编写一个非常简单的程序,它要求用户输入一个名称,然后根据该名称显示一些文本。我可以让程序工作,但我想在用户输入我的猫的名字时显示猫的ASCII图片。我想要像这样的东西

  ^  -  ^
 ( .   . )
   =>;<=
  /     \
 |       |
^-^
( .   . )

=>; 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"