Haskell의 점 연산자
이 Haskell 코드에서 도트 연산자가 수행하는 작업을 이해하려고합니다.
sumEuler = sum . (map euler) . mkList
짧은 답변
점이없는 등가 코드, 즉
sumEuler = \x -> sum ((map euler) (mkList x))
또는 람다없이
sumEuler x = sum ((map euler) (mkList x))
점 (.)은 기능 구성을 나타냅니다.
더 긴 답변
먼저 euler
to 의 부분적 적용을 단순화합시다 map
.
map_euler = map euler
sumEuler = sum . map_euler . mkList
이제 우리는 점만 가지고 있습니다. 이 점은 무엇을 나타 냅니까?
에서 소스 :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
따라서 (.)
는 IS 작성 연산자 .
짓다
수학에서 함수 f (x)와 g (x), 즉 f (g (x))의 구성을 다음과 같이 쓸 수 있습니다.
(f ∘ g) (x)
"g로 구성된 f"로 읽을 수 있습니다.
따라서 Haskell에서 f ∘ g 또는 g로 구성된 f는 다음과 같이 쓸 수 있습니다.
f . g
컴포지션은 연관성이 있습니다. 즉, 컴포지션 연산자로 작성된 f (g (h (x)))는 모호함없이 괄호를 생략 할 수 있습니다.
즉, (f ∘ g) ∘ h는 f ∘ (g ∘ h)와 동일하므로 간단히 f ∘ g ∘ h로 쓸 수 있습니다.
뒤로 돌기
이전 단순화로 돌아 가면 다음과 같습니다.
sumEuler = sum . map_euler . mkList
이는 sumEuler
해당 기능의 적용되지 않은 구성 임을 의미합니다 .
sumEuler = \x -> sum (map_euler (mkList x))