2017-02-25 4 views
0

\nputStrLnprintを使ってブレークラインを試しましたが、何も動作しません。私はHaskellでラインを壊すことができますか?

\nを使用すると、結果は文字列を連結するだけで、putStrLnまたはprintを使用すると、タイプエラーが発生します。 \nため

出力:

formatLines [("a",12),("b",13),("c",14)] 
"a...............12\nb...............13\nc...............14\n" 

putStrLn用の出力:

format.hs:6:22: 
    Couldn't match type `IO()' with `[Char]' 
    Expected type: String 
     Actual type: IO() 
    In the return type of a call of `putStrLn' 
    In the expression: 
     putStrLn (formatLine ((fst x), (snd x)) ++ formatLines xs) 
    In an equation for `formatLines': 
     formatLines (x : xs) 
      = putStrLn (formatLine ((fst x), (snd x)) ++ formatLines xs) 
Failed, modules loaded: none. 

printのための出力はputStrLn

のと同じである。ここに私のコードは次のとおりです。

formatLine :: (String,Integer) -> String 
formatLine (s, i) = s ++ "..............." ++ show i 

formatLines::[(String,Integer)] -> String 
formatLines [] = "" 
formatLines (x:xs) = print (formatLine ((fst x), (snd x)) ++ formatLines xs) 

私はprintputStrLnのエラーの理由を理解するが、私はそれを修正する方法は考えています。

答えて

5

コードを2つに分割します。

1つの部分は単に文字列を構成します。改行には"\n"を使用してください。

2番目の部分は文字列を受け取り、putStrLn(NOT print)を適用します。改行は正しく印刷されます。

例:

foo :: String -> Int -> String 
foo s n = s ++ "\n" ++ show (n*10) ++ "\n" ++ s 

bar :: IO() 
bar = putStrLn (foo "abc" 42) 
    -- or putStr (...) for no trailing newline 

baz :: String -> IO() 
baz s = putStrLn (foo s 21) 

あなたの代わりにprintを使用する場合は、その内部に引用符とエスケープ(\nのような)で、文字列表現を印刷します。 printは、数字のような文字列に変換する必要がある値にのみ使用してください。

戻り値の型がIO (something)の関数では、IO(印刷物のような)しかできません。

+0

私は完全に理解していませんでした。 barの戻り値はIO()であり、入力はありませんが、bar関数にパラメータを渡したい場合は?私は入力を指定する必要があるので。たとえば、 'bar s i = putStrLn(foo s i)'? – Marcio

+1

@Marcio引数を追加できます。あなたの例の 'bar'は' bar :: String - > Int - > IO() '型を持ちます。 – chi

+0

ありがとうございました!しかし、私はさらに疑問を持っています:barの結果をStringに連結する方法がいくつか存在しますか?私は 'show'で、次のようなことをしています:' 'hello" ++(show baz s) 'しかし、動作しませんでした。 "show"の使用に起因する(Show(IO())のインスタンスがありません "と表示され、何がショーのインスタンスになるかはわかりません。私があなたを利用しているのならごめんなさい – Marcio

1

結果を出力する必要があります。

これはIOアクションなので、関数シグネチャは-> Stringで終わることはできません。代わりに@chiが指摘するように、戻り値の型はIO()でなければなりません。さらに、書式設定された文字列を生成する機能を既に持っているので、入力リストに印刷アクションを割り当てるのに必要な機能だけが必要です。これは、あなたがそうのように、mapM_を使用して行うことができます。

formatLines::[(String,Integer)] -> IO() 
formatLines y = mapM_ (putStrLn . formatLine) y 

Demo

関連する問題