2017-05-01 12 views
0

foldrの使い方について質問があります。foldr in Haskell:混乱

は、私がこのようにfoldr使いたいと言う:

foldr (\x y -> (x + y)/2) 2 [4,5,6] 

、この場合にはyされたリストの各要素を表し?


特に、この機能をアンラップしましょう。

我々有する(X = 2、Y = 6) - >(2 + 6)/ 2 = 4

次に、我々は、x = 4、yは5 =持っていますか?

私は本当に尋ねたいものを簡略化したバージョンを求めています。ここで、xとyの内容は、私のアプリケーションでは、第1引数をタイプa、第2引数をタイプbとする関数を持つため、多くのことを表しています。したがって、私はボンネットの下で何が起こっているのかを知る必要があります。

答えて

1

foldr f startingValue (x:xs)f x (foldr f startingValue xs)に展開し、foldr f startingValue []startingValueに展開ので、あなたの場合:あなたは短所のリストが構築されている方法を理解していれば

foldr f 2 [4,5,6] 
f 4 (foldr f 2 [5,6]) 
f 4 (f 5 (foldr f 2 [6])) 
f 4 (f 5 (f 6 (foldr f 2 []))) 
f 4 (f 5 (f 6 2)) 
f 4 (f 5 4) 
f 4 4.5 
4.25 

foldr (\x y -> (x + y)/2) 2 [4,5,6] 
(\x y -> (x + y)/2) 4 (foldr (\x y -> (x + y)/2) 2 [5,6]) 
(\x y -> (x + y)/2) 4 ((\x y -> (x + y)/2) 5 (foldr (\x y -> (x + y)/2) 2 [6])) 
(\x y -> (x + y)/2) 4 ((\x y -> (x + y)/2) 5 ((\x y -> (x + y)/2) 6 (foldr (\x y -> (x + y)/2) 2 []))) 
(\x y -> (x + y)/2) 4 ((\x y -> (x + y)/2) 5 ((\x y -> (x + y)/2) 6 2)) 
(\x y -> (x + y)/2) 4 ((\x y -> (x + y)/2) 5 4) 
(\x y -> (x + y)/2) 4 4.5 
4.25 

f x y = (x + y)/2で見ることが容易になるかもしれません(:を使用して)foldrは、あなたが提供する機能で:をすべて置き換えると考えることができます。

2

は、私がこのようにfoldr使いたいと言う:

foldr (\x y -> (x + y)/2) 2 [4,5,6] 

は、この場合にはyされたリストの各要素を表し?それを考え出すの

一つの方法は、foldrの種類を見ている:

GHCi> :t foldr 
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b 

(あなたのケースでは、あなたがリストを持っているし、そうt一部Foldable tためt aを入力した折り畳まれた構造[])であり、その要素はタイプaです。折りたたみによって蓄積された結果は、タイプbです。折りたたみに使用されるバイナリ関数は、タイプがa -> b -> bなので、要素は最初の引数として渡され、累積された値は2番目の引数として渡されます。

もう1つの方法はthe actual implementation of foldr for listsです(これはFoldable instance of listsを探してソースリンクをたどります)。 1つの画像が他の画像とどのように対応しているかを確認することができます。