私はいくつかの講師のサイトで見つけたいくつかの練習をして、数ヶ月間自分で数ヶ月間ハスケルを学んでいましたが、私はこの問題を偶然見つけました。IOについてのハスケルの練習を解決する方法
「接続されている」という2つのタスクがあります。私は最初のものを簡単に解決しましたが、もう一方の方法を本当に理解していません。
ここでは最初のものです:
練習2(HaskellではリコールIOプログラミングとやる表記)
繰り返しから整数を読み込み、再帰関数を
sumInts :: Integer -> IO Integer
書きますIOが0になるまで繰り返す。 その時点で、関数は、入力されたすべての数値の合計と関数のパラメータとして与えられた元の(デフォルトの)値を加えたものを返さなければなりません。
私はこの1つをこのように解決:
getInt :: IO Integer
getInt = do
s <- getLine
return (read s)
sumInts :: Integer -> IO Integer
sumInts input = do
x<-getInt
if x==0 then return input else (x+) <$> sumInts input
行うことは非常に簡単でした。ここでもう一つ、私は理解できない一つだ。
練習3.高次 関数に、与えられた読書IOアクション、終了条件のため
whileIO :: IO a -> (a -> Bool) -> (a -> a -> a) -> a -> IO a
を以前のIOの相互作用を一般化折りたたみ機能 と元の値は、必要なIOアクションを返します。 ためgetIO、condF、foldFのいくつかの値が、私たちはこの1つを持ついくつかの助けを大好きだ
sumInts = whileIO getIO condF foldF
としてsumIntsを再定義することができていることを確認してください。 :)
'(x +)<$> sumInts input'の代わりに、' sumInts(x + input) 'を実行するだけです。 ---「折畳み」とは、「蓄積」を意味します。 –
また、 'input'引数を完全に削除して、ベースケースを0に置き換え、再帰的に'(x +)<$> sumInts'と書くこともできます。もちろん、問題の仕様では入力を受け入れる必要があるので、私の提案は 'go'補助関数などで行う必要があります。 – amalloy