gpt4 book ai didi

haskell - 打印一些东西的递归函数

转载 作者:行者123 更新时间:2023-12-01 23:29:28 27 4
gpt4 key购买 nike

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

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

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

对于前面的列表,这里是标准输出的结果:

__**__

我认为我必须做这样的事情:

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 '_'
<b>displayLine xs</b>
displayLine (1 : xs) = do
print '*'
<b>displayLine xs</b>

您可能还想使用 putChar :: Char -> IO ()打印单个字符,因为 print 将调用 show 并因此打印一个 Char literal 和一个新行.

然而,这重复了逻辑。我们可以利用 mapM_ :: (Foldable f, Monad m) => (a -> m b) -> f a -> m ()执行映射,其中每个元素执行一个单子(monad)操作:

displayLine :: [Int] -> IO ()
displayLine = <b>mapM_</b> (<b>putChar</b> . f)
where f 0 = '_'
f 1 = '*'

例如:

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

末尾的 putStrLn "" 用于在打印字符后开始新的一行。

关于haskell - 打印一些东西的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66563049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com