Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 简单Haskell环_Loops_Haskell_Io - Fatal编程技术网

Loops 简单Haskell环

Loops 简单Haskell环,loops,haskell,io,Loops,Haskell,Io,我刚开始学习Haskell,但是现在没有循环是非常令人沮丧的。我知道了如何为函数编写循环。然而,我的问题是,我想在迭代循环时输出一些结果。似乎我必须使用debug来执行这个简单的任务 现在我只想举一个例子,说明如何在主结构中将字符串打印10次 换句话说,我想这样做10次: main = do putStrLn "a string" 谢谢。我觉得这对我的任务很有启发性。Haskell的IO在刚开始的时候有点棘手,因为它是基于Monad的 不过,您的问题有一个简单的解决方案: mai

我刚开始学习Haskell,但是现在没有循环是非常令人沮丧的。我知道了如何为函数编写循环。然而,我的问题是,我想在迭代循环时输出一些结果。似乎我必须使用debug来执行这个简单的任务

现在我只想举一个例子,说明如何在主结构中将字符串打印10次

换句话说,我想这样做10次:

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 ""
  )