在Haskell中使用递归来打印出符号代码及其相应的符号

时间:2012-06-12 13:20:46

标签: haskell printing recursion char symbols

就像标题所说我在使用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)'

我做错了什么,是否有更简单的方法(例如不使用跟踪模块)?

2 个答案:

答案 0 :(得分:5)

您需要将Char生成的chr z转换为String(例如,通过[chr z]return (chr z)或{{1}等)。否则,您无法在使用chr z : []之前将其附加到字符串。

++

答案 1 :(得分:4)

trace用于调试以外的任何内容都是一个坏主意,因为the execution order is unreliable

如果要对范围内的所有整数执行某些操作,请首先创建要处理的整数列表[0 .. 127]。要输出某些文本,您应该使用putStrLn等IO操作。与trace不同,putStrLn将始终在应用时执行。 Map对您的列表执行此IO操作以打印所有字符。

showCharCode n = putStrLn ("Symbol code " ++ show n ++ " is " ++ [chr n])
foo = mapM_ showCharCode [0 .. 127]