Loops 简单Haskell环
我刚开始学习Haskell,但是现在没有循环是非常令人沮丧的。我知道了如何为函数编写循环。然而,我的问题是,我想在迭代循环时输出一些结果。似乎我必须使用debug来执行这个简单的任务 现在我只想举一个例子,说明如何在主结构中将字符串打印10次 换句话说,我想这样做10次:Loops 简单Haskell环,loops,haskell,io,Loops,Haskell,Io,我刚开始学习Haskell,但是现在没有循环是非常令人沮丧的。我知道了如何为函数编写循环。然而,我的问题是,我想在迭代循环时输出一些结果。似乎我必须使用debug来执行这个简单的任务 现在我只想举一个例子,说明如何在主结构中将字符串打印10次 换句话说,我想这样做10次: main = do putStrLn "a string" 谢谢。我觉得这对我的任务很有启发性。Haskell的IO在刚开始的时候有点棘手,因为它是基于Monad的 不过,您的问题有一个简单的解决方案: mai
main = do
putStrLn "a string"
谢谢。我觉得这对我的任务很有启发性。Haskell的IO在刚开始的时候有点棘手,因为它是基于Monad的 不过,您的问题有一个简单的解决方案:
main = replicateM_ 10 $ putStrLn "a string"
这是使用Control.Monad
它有许多用于编写和执行一元操作的有用函数。您可以定义一个递归函数,它可以打印“字符串”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\uu
我也是Haskell的初学者,我有一个不太优雅但实用的解决方案
main = do
putStr result
where
string = "a string"
result = concat [string ++ "\n" | i <- [1,2..10]]
main=do
putStr结果
哪里
string=“字符串”
result=concat[string++“\n”| i我认为执行for循环最必要的形式是:
for list action = mapM_ action list
main :: IO Int
main = do
for [0..10] (\ i -> do
print(i^2)
)
return 0
在我看来,这实际上很像C代码。这样做可以让你循环一个特定的函数,使它更加可重用(而不是为你想循环的每一个新东西写出来)
loop::Int->(IO())->IO()
循环0=返回()
环路=
做
F
环(n-1)f
示例:
main=do
环路5(do
“你好”
putStrLn“那里”)
详细说明你的答案对他的好处:Haskell有for
和while
循环,但它们是库函数,而不是内置的语言。例如,与for
循环等价的是表单
组合符,来自控件。Monad
。不过,在这种情况下,replicateM
更重要简明。这里要回答的真正问题是,当你想在函数式语言中进行“循环”时,你使用递归。唯一令人讨厌的是,如果你看它的话:由于单体构造函数(在本例中为IO),类型没有对齐。因此,你需要一个“拼接”的递归结构一元绑定一直向下。换句话说,这只是递归,在处理“特殊”时略有变化Haskell对待IO的方式。即使我是Haskell的初学者,但我想分享我所获得的一点见解。有人告诉我,当你想在Haskell中执行循环时,可以考虑递归或列表理解。这与你的问题无关,但假设你想在列表中添加所有元素。当然,你需要迭代所有元素元素。递归会起作用,使用列表理解也会起作用。@JohnRed我不认为你能用LC总结列表。LC基本上只是flatMap
。
main = do
loop 3 (do
loop 4 (putStrLn "Hi")
putStrLn ""
)