Haskell의 함수중 (.)만큼 많이 쓰이는 것이 있을까? compose 연산자다.
f . g = f (g x)
그런데 (.)의 두번째 인자는 입력을 하나만 처리한다. concat xss 와 map f xs 의 concat 과 map 을 합성하려면?
concat . map -- 성립하지 않는다.
map 을 인자 하나면 처리하면 여전히 함수이며, 이는 concat의 입력타입([[x]])과 일치하지 않기 때문이다. 그래서...
concatMap f = concat . map f
map의 첫 인자를 적용한 상태로 합성하면 된다. 하지만 f를 제거하여 합성하고 싶다면???
concatMap = concat .: map
여기서 (.:)는 외우기 참 쉬운데, 정의는 모양 그대로 점셋(.:)을 펼쳐놓은 것 (.)(.)(.) 이며, 타입 역시 모양 그대로 왼쪽점 하나(왼쪽항이 인자 하나), 오른쪽 점 둘(오른쪽 항이 인자 둘을 처리)의 합성이다.
(.:) :: (c->d) -> (a->b->c) -> a->b->d
(.:) = (.)(.)(.)
f . g = f (g x)
그런데 (.)의 두번째 인자는 입력을 하나만 처리한다. concat xss 와 map f xs 의 concat 과 map 을 합성하려면?
concat . map -- 성립하지 않는다.
map 을 인자 하나면 처리하면 여전히 함수이며, 이는 concat의 입력타입([[x]])과 일치하지 않기 때문이다. 그래서...
concatMap f = concat . map f
map의 첫 인자를 적용한 상태로 합성하면 된다. 하지만 f를 제거하여 합성하고 싶다면???
concatMap = concat .: map
여기서 (.:)는 외우기 참 쉬운데, 정의는 모양 그대로 점셋(.:)을 펼쳐놓은 것 (.)(.)(.) 이며, 타입 역시 모양 그대로 왼쪽점 하나(왼쪽항이 인자 하나), 오른쪽 점 둘(오른쪽 항이 인자 둘을 처리)의 합성이다.
(.:) :: (c->d) -> (a->b->c) -> a->b->d
(.:) = (.)(.)(.)