Haskell Language
기능 구성
수색…
비고
함수 합성 연산자 (.)
는 다음과 같이 정의됩니다.
(.) :: (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 ...
따라서 "데이터 흐름"은 오른쪽에서 왼쪽으로 진행됩니다. x
는 g
로 이동하고 결과는 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