foldr
Posted on June 4, 2016
by 주형
fold는 리스트를 순회하면서 값을 합쳐나가는 함수입니다.
foldr :: (a -> b -> b) -> b -> [a] -> b
첫 번째 인자로 값을 누적해가는 함수를 받습니다. 두 번째 인자로 초기 값을 받습니다. 세 번째 값으로 리스트를 받아서 값을 누적해갑니다.
foldr을 recursive를 사용하여 구현하면 다음과 값습니다.
foldr f v [] = v
foldr f v (x:xs) = f x (foldr f v xs)
중복해서 나오는 foldr f v 를 y 로 치환해서 보면 구조가 잘 보입니다.
= foldr f v
y
= v
y [] :xs) = x `f` (y xs) y (x
foldr를 쓰는 간단한 예시로 리스트를 전부 더하는 함수나 곱하는 함수가 있습니다.
sum :: Num a => [a] -> a
sum [] = 0
sum (x:xs) = x + (sum xs)
product :: Num a => [a] -> a
product [] = 1
product (x:xs) = x * (product xs)
보면 foldr의 정의와 매우 닮아있습니다. sum의 경우엔 foldr의 v 가 0이고 f가 (+)가 됩니다.
sum = foldr (+) 0
product = foldr (*) 1