1

タイトルにあるように、Haskell を使用してシンボル コードとそれに対応するシンボルを出力するのに問題があります。

import Data.Char
import Debug.Trace

foo z | trace ("Symbolcode " ++ show z ++ " is " ++ (chr z)) False = undefined
foo z = if (z <= 128)
    then foo (z+1)
    else show "All done."

...そして、次のようなエラーが表示されます。

Couldn't match expected type `[Char]' with actual type `Char'
In the return type of a call of `chr'
In the second argument of `(++)', namely `(chr z)'
In the second argument of `(++)', namely `" is " ++ (chr z)'

私は何を間違っていますか?また、これを行う簡単な方法はありますか (たとえば、トレース モジュールを使用しない)?

4

2 に答える 2

5

Charによって生成されたをchr zに変換する必要がありますString(たとえば、[chr z]またはreturn (chr z)またはchr z : []などを介して)。それ以外の場合は、を使用する前に文字列に追加することはできません++

foo z | trace ("Symbolcode " ++ show z ++ " is " ++ [chr z]) False = undefined
于 2012-06-12T13:23:13.883 に答える
4

実行順序が信頼できないtraceため、デバッグ以外の目的で使用することはお勧めできません。

範囲内のすべての整数に対して何かを実行する場合は、[0 .. 127]処理する整数のリストを作成することから始めます。テキストを出力するには、などのIOアクションを使用する必要がありますputStrLn。とは異なりtraceputStrLn実行されるはずのときに常に実行されます。 このIOアクションをリストにマップして、すべての文字を印刷します。

showCharCode n = putStrLn ("Symbol code " ++ show n ++ " is " ++ [chr n])
foo = mapM_ showCharCode [0 .. 127]
于 2012-06-12T13:36:51.353 に答える