简单Haskell环

iswrvxsc  于 2022-12-29  发布在  其他
关注(0)|答案(6)|浏览(135)

我刚开始学习Haskell,但是现在没有循环是无限令人沮丧的。我弄清楚了如何为函数编写循环。然而,我的问题是,我想在迭代循环的同时输出一些结果。看来我必须使用debug来执行这个简单的任务。
所以现在我只想看一个例子,如何在主结构中打印一个字符串10次。
换句话说,我想这样做10次:

main = do  
    putStrLn "a string"

谢谢,我觉得这对我的工作很有启发。

ut6juiuv

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_

hjqgdpho

hjqgdpho2#

Haskell的IO在你刚开始的时候有点棘手,因为它是基于单子的。
不过,你的问题有一个简单的解决方案:

main = replicateM_ 10 $ putStrLn "a string"

这里使用的是Control.Monad中的组合符replicateM_
它有许多有用的函数来组合和执行一元动作。

b5buobof

b5buobof3#

我也是Haskell的初学者,我有一个不那么优雅但实用的解决方案。

main = do 
    putStr result
    where
        string = "a string"
        result = concat [string ++ "\n" | i <- [1,2..10]]

在这里,我们定义了一个列表,它的元素是要打印出来的字符串,后面跟一个换行符。

avwztpqn

avwztpqn4#

我认为执行for循环最必要的形式是:

for list action = mapM_ action list

main :: IO Int
main = do
    for [0..10] (\ i -> do

        print(i^2)
        )
    return 0

在我看来,这看起来很像C代码。

hgncfbus

hgncfbus5#

这样做可以让你循环一个特定的函数,使它更可重用(而不是为你想循环的每一个新的东西写出它)。

loop :: Int -> (IO()) -> IO()
loop 0 _ = return ()
loop n f =
 do
  f
  loop (n - 1) f

示例:
x一个一个一个一个x一个一个二个x

wfypjpf4

wfypjpf46#

我的解决方案:

n = 10
doSomething () = putStrLn "a string"
main = sequence (replicate n (doSomething()))
  • sequence:顺序求解列表中的每个IO a
  • replicate n ele:构建一个重复elen次的列表,如take n (repeat ele)

相关问题