次のような単純なfoldrステートメントを理解しています
foldr (+) 0 [1,2,3]
ただし、より複雑なfoldrステートメント、つまり関数で2つのパラメーターを使用するステートメントと、/および-の計算に問題があります。これらの答えを得るために発生する手順を説明できる人はいますか?
foldr (\x y -> (x+y)*2) 2 [1,3] = 22
foldr (/) 2 [8,12,24,4] = 8.0
ありがとう。
次のような単純なfoldrステートメントを理解しています
foldr (+) 0 [1,2,3]
ただし、より複雑なfoldrステートメント、つまり関数で2つのパラメーターを使用するステートメントと、/および-の計算に問題があります。これらの答えを得るために発生する手順を説明できる人はいますか?
foldr (\x y -> (x+y)*2) 2 [1,3] = 22
foldr (/) 2 [8,12,24,4] = 8.0
ありがとう。
関数は次のfoldr
ように定義されます。
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr _ a [] = a
foldr f a (x:xs) = f x (foldr f a xs)
ここで、次の式を考えてみましょう。
foldr (\x y -> (x + y) * 2) 2 [1,3]
ラムダに名前を付けます。
f x y = (x + y) * 2
したがって:
foldr f 2 [1,3]
-- is
f 1 (foldr f 2 [3])
-- is
f 1 (f 3 (foldr f 2 []))
-- is
f 1 (f 3 2)
-- is
f 1 10
-- is
22
同様に:
foldr (/) 2 [8,12,24,4]
-- is
8 / (foldr (/) 2 [12,24,4])
-- is
8 / (12 / (foldr (/) 2 [24,4]))
-- is
8 / (12 / (24 / (foldr (/) 2 [4])))
-- is
8 / (12 / (24 / (4 / (foldr (/) 2 []))))
-- is
8 / (12 / (24 / (4 / 2)))
-- is
8 / (12 / (24 / 2.0))
-- is
8 / (12 / 12.0)
-- is
8 / 1.0
-- is
8.0
それが役に立ったことを願っています。