web-dev-qa-db-ja.com

単純なHaskellループ

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

ですから、今は、メイン構造体で文字列を10回印刷する方法の例に感謝します。

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

main = do  
    putStrLn "a string" 

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

30
TurtleTread

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

46
sepp2k

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

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

main = replicateM_ 10 $ putStrLn "a string"

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

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

31
jozefg

私はHaskellの初心者でもあり、エレガントではないが実用的には役立つ解決策があります。

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

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

1
Enzhi Li