46

私は Haskell を学び始めたばかりですが、今のところループがないことに非常にイライラしています。関数のループの書き方がわかりました。しかし、私の問題は、ループを繰り返しながらいくつかの結果を出力したいということです。この単純なタスクを実行するには、デバッグを使用する必要があるようです。

したがって、今のところ、メイン構造で文字列を 10 回出力する方法の例をいただければ幸いです。

言い換えれば、これを10回やりたい:

main = do  
    putStrLn "a string" 

ありがとう。これは私の仕事にとって非常に明るいものになると思います。

4

5 に答える 5

62

次のように、「文字列」を 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_ます。

于 2013-04-14T21:14:46.420 に答える
39

Haskell の IO は、モナドに基づいているため、始めたばかりの場合は少し注意が必要です。

あなたの問題には簡単な解決策があります:

main = replicateM_ 10 $ putStrLn "a string"

replicateM_これはからのコンビネータを使用していますControl.Monad

モナドアクションを構成して実行するための便利な関数がたくさんあります。

于 2013-04-14T21:13:38.433 に答える
3

私は Haskell の初心者でもありますが、エレガントではありませんが実用的に役立つソリューションがあります。

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

ここで、リストを定義しました。その要素は、出力したい文字列とそれに続く改行文字です。

于 2016-10-10T15:24:32.527 に答える
1

forループを実行する最も必須の形式は次のとおりだと思います。

for list action = mapM_ action list

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

        print(i^2)
        )
    return 0

これは実際、私には C コードのように見えます。

于 2020-09-10T23:57:18.177 に答える
1

このようなことを行うと、特定の関数をループして再利用しやすくすることができます (ループしたい新しいものごとに書き出すのではなく)。

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

例:

main = do
 loop 5 (do
  putStr "hello "
  putStrLn "there")
main = do
 loop 3 (do
  loop 4 (putStrLn "Hi")
  putStrLn ""
  )
于 2020-10-18T12:59:26.440 に答える