2016-12-15 4 views
1

私はいくつかの講師のサイトで見つけたいくつかの練習をして、数ヶ月間自分で数ヶ月間ハスケルを学んでいましたが、私はこの問題を偶然見つけました。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を再定義することができていることを確認してください。 :)

+1

'(x +)<$> sumInts input'の代わりに、' sumInts(x + input) 'を実行するだけです。 ---「折畳み」とは、「蓄積」を意味します。 –

+0

また、 'input'引数を完全に削除して、ベースケースを0に置き換え、再帰的に'(x +)<$> sumInts'と書くこともできます。もちろん、問題の仕様では入力を受け入れる必要があるので、私の提案は 'go'補助関数などで行う必要があります。 – amalloy

答えて

2

ヒント:

ではなく、それらをハードコーディングのパラメータとしての作品を作り、あなたのコードを一般化してみてください。たとえば、getIntをより一般的なgetIOパラメータに置き換えます。

sumInts :: IO Integer -> Integer -> IO Integer 
sumInts getIO input = do 
    -- ^^^^^ 
    x<-getIO -- <------ 
    if x==0 then return input else (x+) <$> sumInts input 

次に、x==0を汎用述語で置き換えます。

(x+)を汎用折り畳み機能で置き換えます。

など。

最終的には、欲しいものがwhileIOになります。また、練習で提案されたより一般的なタイプにすることもできます。

+0

ヒントをありがとう、私は今試してみます。まだ私はそれで終わっていないが、私はまだ答えをマークしていない!ありがとう。 – iWanabi

関連する問題