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)