我刚开始学习Haskell,但是现在没有循环是无限令人沮丧的。我弄清楚了如何为函数编写循环。然而,我的问题是,我想在迭代循环的同时输出一些结果。看来我必须使用debug来执行这个简单的任务。所以现在我只想看一个例子,如何在主结构中打印一个字符串10次。换句话说,我想这样做10次:
main = do putStrLn "a string"
谢谢,我觉得这对我的工作很有启发。
ut6juiuv1#
你可以定义一个递归函数,将“一个字符串”打印n次(n是函数的参数),如下所示:
printStringNTimes 0 = return () printStringNTimes n = do putStrLn "a string" printStringNTimes (n-1) main = printStringNTimes 10
一种更通用的方法是定义一个函数,该函数将任何IO操作重复n次:
repeatNTimes 0 _ = return () repeatNTimes n action = do action repeatNTimes (n-1) action main = repeatNTimes 10 (putStrLn "a string")
上述函数已存在于Control.Monad中,名称为replicateM_。
Control.Monad
replicateM_
hjqgdpho2#
Haskell的IO在你刚开始的时候有点棘手,因为它是基于单子的。不过,你的问题有一个简单的解决方案:
main = replicateM_ 10 $ putStrLn "a string"
这里使用的是Control.Monad中的组合符replicateM_它有许多有用的函数来组合和执行一元动作。
b5buobof3#
我也是Haskell的初学者,我有一个不那么优雅但实用的解决方案。
main = do putStr result where string = "a string" result = concat [string ++ "\n" | i <- [1,2..10]]
在这里,我们定义了一个列表,它的元素是要打印出来的字符串,后面跟一个换行符。
avwztpqn4#
我认为执行for循环最必要的形式是:
for list action = mapM_ action list main :: IO Int main = do for [0..10] (\ i -> do print(i^2) ) return 0
在我看来,这看起来很像C代码。
hgncfbus5#
这样做可以让你循环一个特定的函数,使它更可重用(而不是为你想循环的每一个新的东西写出它)。
loop :: Int -> (IO()) -> IO() loop 0 _ = return () loop n f = do f loop (n - 1) f
示例:x一个一个一个一个x一个一个二个x
wfypjpf46#
我的解决方案:
n = 10 doSomething () = putStrLn "a string" main = sequence (replicate n (doSomething()))
sequence
IO a
replicate n ele
ele
n
take n (repeat ele)
6条答案
按热度按时间ut6juiuv1#
你可以定义一个递归函数,将“一个字符串”打印n次(n是函数的参数),如下所示:
一种更通用的方法是定义一个函数,该函数将任何IO操作重复n次:
上述函数已存在于
Control.Monad
中,名称为replicateM_
。hjqgdpho2#
Haskell的IO在你刚开始的时候有点棘手,因为它是基于单子的。
不过,你的问题有一个简单的解决方案:
这里使用的是
Control.Monad
中的组合符replicateM_
它有许多有用的函数来组合和执行一元动作。
b5buobof3#
我也是Haskell的初学者,我有一个不那么优雅但实用的解决方案。
在这里,我们定义了一个列表,它的元素是要打印出来的字符串,后面跟一个换行符。
avwztpqn4#
我认为执行for循环最必要的形式是:
在我看来,这看起来很像C代码。
hgncfbus5#
这样做可以让你循环一个特定的函数,使它更可重用(而不是为你想循环的每一个新的东西写出它)。
示例:
x一个一个一个一个x一个一个二个x
wfypjpf46#
我的解决方案:
sequence
:顺序求解列表中的每个IO a
replicate n ele
:构建一个重复ele
n
次的列表,如take n (repeat ele)