Haskell 打印某物的递归函数

Haskell 打印某物的递归函数,haskell,Haskell,我有一个类型为[Int]的列表,它只能包含两个值:0或1 示例:[0,0,1,1,0,0] 我希望遍历此列表,当当前元素为0时,打印',如果是1,则打印'*' 对于上一个列表,以下是标准输出的结果: \uu**\ uuuu 我想我必须这样做: displayLine :: [Int] -> IO [Int] displayLine (0 : xs) = do print '_' -- next char displayLine (1 : xs) =

我有一个类型为
[Int]
的列表,它只能包含两个值:
0
1

示例:
[0,0,1,1,0,0]

我希望遍历此列表,当当前元素为0时,打印
'
,如果是1,则打印
'*'

对于上一个列表,以下是标准输出的结果:

\uu**\ uuuu

我想我必须这样做:

displayLine :: [Int] -> IO [Int]
displayLine (0 : xs) =
    do
        print '_'
        -- next char
displayLine (1 : xs) =
    do
        print '*'
        -- next char

如何显示一个字符并继续下一个字符的递归?

使用列表的尾部调用
displayLine
。但是这里的类型将是
IO()
,而不是
IO[Int]
,因为操作不会返回任何内容:

displayLine :: [Int] -> IO ()
displayLine (0 : xs) = do
        print '_'
        displayLine xs
displayLine (1 : xs) = do
        print '*'
        displayLine xs
例如:

Prelude> displayLine [0,1,1,0,1,0] >> putStrLn ""
_**_*_

结尾处的
putStrLn”“
用于在字符打印后开始一行新行。

关于
do
-表示法的好处是,代码通常看起来就像命令式语言中的代码():在结尾处有两个语句和一个
返回:

displayLine (0 : xs) =  do
    print '_'
    ys <- displayLine xs -- ys will be identical to xs,
    return (0:ys)
displayLine(0:xs)=do
打印‘’

ys你可以正常地…调用
displayLine
,不是吗?但更好的方法是将其分为两部分编写:首先编写类型为
[Int]->String
的函数以生成要打印的字符串,然后
打印
生成的
字符串
displayLine (0 : xs) =  do
    print '_'
    ys <- displayLine xs -- ys will be identical to xs,
    return (0:ys)