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. 与trace,不同,putStrLn它总是会在它应该执行的时候执行。 将此 IO 操作映射到您的列表以打印所有字符。

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