2017-04-09 20 views
-3

私はハスケルでユーザーに名前を尋ね、その名前に基づいてテキストを表示する非常に単純なプログラムを書いています。私はプログラムを動作させることができますが、ユーザが私の猫の名前を入力すると、猫のASCII画像を表示したいと思います。`putStrLn`で複数行の文字列を印刷するには?

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

私は「これがうまくいくかどうか」のアプローチはputStrLnを使用することでした。それは動作しません。私に何ができる?ありがとう。私の試み

if name == "cat" 
    then putStrLn (" ^-^
         (. .) 
          =>;<= 
         / \ 
         |  |") 
+0

「putStrLn」はどのように機能しませんか? – Lee

+0

@私は私の素朴な試みを示すために質問を編集しました。 –

答えて

6

リー "どのようにしてputStrLnが機能しないのですか?"

if name == "cat" 
    then putStrLn (" ^-^
         (. .) 
          =>;<= 
         / \ 
         |  |") 

エラーメッセージを含める必要があります。あなたはHaskellの文字列リテラルで改行を持つことができないためである

so.hs:3:38: error: 
    lexical error in string/character literal at character '\n' 

:トップレベルの機能でこれを配置する(test name = ...)コードが使用してコンパイルに失敗します。 。ハスケルで、複数行の文字列は、あなたが既にエスケープされている必要がありますあなたのASCIIアートで非エスケープバックスラッシュを持っていた各行の先頭と末尾に特別なエスケープ(バックスラッシュが必要ですので、我々は、あまりにも修正します:

test name = 
     if name == "cat" 
    then putStrLn (" ^- ^\n\ 
        \  (. .)\n\ 
        \  =>;<=\n\ 
        \ / \\\n\ 
        \  |  |") 

は今Haskellでif文はより三項演算子のようなものですので、十分に型付けされたままに他の枝を必要とするため、我々は別のエラーを取得したコードは次のとおりです。

test name = 
     if name == "cat" 
     then putStrLn (" ^- ^\n\ 
         \  (. .)\n\ 
         \  =>;<=\n\ 
         \ / \\\n\ 
         \  |  |") 
     else return() 

また、あなたがきれいのために準引用符を使用することができますこれにはstring-qqパッケージとquasiquotes laが必要ですnguage拡張子。拡張子は、構文[|<quoter name>|<string>|]があり、文字列QQのパッケージには、文字列のsという名前のクォータを提供しています。

{-# LANGUAGE QuasiQuotes #-} 
import Data.String.QQ 
import Control.Monad (when) 

test2 name = 
    when (name == "cat") $ putStrLn [s| 
    ^-^
    (. .) 
     =>;<= 
    / \\ 
    |  ||] 
+0

私はあなたの2番目の例を得ることができます。ありがとう。あなたの3番目の例を試してみると、モジュールが見つからないと言われています。Data.String.QQ –

+0

@ JoeJohnson126 'string-qq'パッケージを先にインストールしましたか? –

+0

私はしませんでした。私はそれをする方法を理解しようとします。これらは、プログラムを学ぶ私の最初のカップルです。 –

5

ここで私は時々使う別の代替、です:

putStr $ unlines 
    [ " ^- ^" 
    , "  (. .)" 
    , "  =>;<=" 
    , " / \\" 
    , "  |  |" 
    ] 

unlinesは取る標準関数であります文字列のリストを作成し、各文字列の後に改行を挿入して連結します(最後の文字列を含む)。なぜ代わりにputStrを使用したのですか?

> unlines ["abc", "def", "ghi"] 
"abc\ndef\nghi\n" 
関連する問題