수색…


비고

함수 합성 연산자 (.) 는 다음과 같이 정의됩니다.

(.) :: (b -> c) -> (a -> b) ->  (a -> c)
(.)       f           g          x =  f (g x)     -- or, equivalently,  

(.)       f           g     =   \x -> f (g x)     
(.)       f     =    \g     ->  \x -> f (g x)      
(.) =    \f     ->   \g     ->  \x -> f (g x)      
(.) =    \f     ->  (\g     -> (\x -> f (g x) ) ) 

(b -> c) -> (a -> b) -> (a -> c)(b -> c) -> (a -> b) -> a -> c -> 형식 서명에서 왼쪽에 연결된 함수 응용 프로그램에 해당하는 오른쪽에 "연결"

 f g x y z ...    ==    (((f g) x) y) z ...

따라서 "데이터 흐름"은 오른쪽에서 왼쪽으로 진행됩니다. xg 로 이동하고 결과는 f 로 이동하여 최종 결과를 생성합니다.

(.)       f           g          x =  r
                                      where r = f (g x)  
-- g :: a -> b
-- f ::      b -> c
-- x :: a      
-- r ::           c   

(.)       f           g     =    q
                                 where q = \x -> f (g x) 
-- g :: a -> b
-- f ::      b -> c
-- q :: a      -> c

....

구문 상으로, 다음은 모두 동일합니다.

(.) f g x  =  (f . g) x  =  (f .) g x  =  (. g) f x 

"누락 된 인수"가 연산자 근처의 빈 슬롯으로 들어가는 " 연산자 섹션 의 세 가지 규칙"으로 이해하기 쉽습니다.

(.) f g    =  (f . g)    =  (f .) g    =  (. g) f   
--         1             2             3  

방정식의 양측에있는 x 는 생략 할 수 있습니다. 이것을 η-shrinkment라고합니다. 따라서 함수 작성을위한 정의를 적는 간단한 방법은

(f . g) x   =   f (g x)

이것은 물론 "인수" x 말합니다; 우리가 x 없이 그냥 (f . g) 을 쓸 때마다 그것은 point-free 스타일로 알려져있다.

오른쪽에서 왼쪽으로 작성

(.) 는 하나의 출력을 다른 입력으로 입력하는 두 가지 함수를 작성하게합니다.

(f . g) x = f (g x)

예를 들어, 입력 번호의 후속을 제곱하려면, 다음과 같이 쓸 수 있습니다.

((^2) . succ) 1        --    4

(.) 대한 별명 인 (<<<) 도 있습니다. 그래서,

(+ 1) <<< sqrt $ 25    --    6

왼쪽에서 오른쪽으로의 구성

Control.Category 는 함수에 특화되어있을 때 (>>>) 정의합니다.

-- (>>>) :: Category cat => cat a b -> cat b c -> cat a c  
-- (>>>) :: (->) a b -> (->) b c -> (->) a c 
-- (>>>) :: (a -> b) -> (b -> c) -> (a -> c) 
( f >>> g ) x = g (f x)

예:

sqrt >>> (+ 1) $ 25    --    6.0

이진 함수로 구성

정규 컴포지션은 단항 함수에 대해 작동합니다. 바이너리의 경우,

(f .: g) x y = f (g x y)          -- which is also
             = f ((g x) y)
             = (f . g x) y        -- by definition of (.)
             = (f .) (g x) y
             = ((f .) . g) x y   

따라서, η - 수축에 의한 (f .: g) = ((f .) . g)

(.:) f g    = ((f .) . g)
            = (.) (f .) g
            = (.) ((.) f) g
            = ((.) . (.)) f g

so (.:) = ((.) . (.)) , 준 정의.

예 :

(map (+1) .: filter) even [1..5]      --  [3,5]
(length   .: filter) even [1..5]      --  2


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow