적용 펑터
Applicative functor기능 프로그래밍에서 응용 펑터(functor) 또는 줄여서 응용하는 것은 펑터와 모나드 사이의 중간 구조다.적용형 펑터는 (일반 펑커와는 달리) 펑커셜 연산을 시퀀싱할 수 있도록 허용하지만, 후속 펑커의 정의에서 이전 연산의 결과를 사용하는 것은 허용하지 않는다.적용형 펑커스는 범주 이론에서 텐서럴 강도의 느슨한 단일형 펑커스와 동등한 프로그래밍이다.
응용 펑커스는 2008년 코너 맥브라이드와 로스 패터슨에 의해 그들의 논문 "적용" 프로그래밍에서 효과와 함께 소개되었다.[1]
응용 펑커스는 처음에 하스켈에서 도서관 특집으로 등장했지만, 그 이후 이드리스, 아그다, OCaml, 스칼라, F# 등 다른 언어에도 퍼졌다.Glasgow Haskell, Idris, F#는 적용 가능한 functor로 프로그래밍을 용이하게 하도록 설계된 언어 기능을 제공한다.Haskell에서는 적용 가능한 functors가 에 구현된다.Applicative
타자를 치다
정의
Haskell에서 적용은 파라메트릭화된 유형으로, 우리가 생각하기에 그러한 유형의 데이터를 위한 컨테이너와 두 가지 방법을 더한 것이다.pure
그리고<*>
. 매개 변수화된 유형을 고려하십시오.f a
. Thepure
활자 적용법f
활자를 가지고 있다.
순수의 :: a -> f a
그리고 그 적용에 가치를 가져오는 것으로 생각할 수 있다.그<*>
활자 적용법f
활자를 가지고 있다.
(<*>) :: f (a -> b) -> f a -> f b
그리고 응용 프로그램 내부의 기능 적용과 동등한 것으로 생각할 수 있다.[2]
또는, 제공하는 대신<*>
, 라고 불리는 기능을 제공할 수 있다.liftA2
이 두 가지 기능은 서로에 대해 정의될 수 있다. 따라서 최소한 하나의 완전한 정의만이 필요하다.[3]
또한 적용은 다음의 네 가지 평등법을 충족시키기 위해 요구된다.[3]
- ID:
pure id <*> v = v
- 구성:
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
- 동형성:
pure f <*> pure x = pure (f x)
- 교환:
u <*> pure y = pure ($ y) <*> u
모든 적용은 속임수다.명시적으로 말하면, 그 방법들이 있다.pure
그리고<*>
,fmap
으로[3] 실행될 수 있다.
fmap g x = 순수의 g <*> x
통용되는 표기법g <$$BODY$$gt; x
와 같다pure g <*> x
.
예
Haskell에서 Maybe 유형은 유형 클래스의 인스턴스로 만들어질 수 있다.Applicative
다음 정의 사용:[2]
예시 적용성 어쩌면 어디에 -- 순수 : : a -> 아마도 순수의 a = 그냥 a - (<<>) : 어쩌면 (A -> b) - 어쩌면 -> 어쩌면 -> 어쩌면 아무 것도 없어요. <*> _ = 아무 것도 없어요. _ <*> 아무 것도 없어요. = 아무 것도 없어요. (그냥 g) <*> (그냥 x) = 그냥 (g x)
정의 섹션에 명시된 바와 같이,pure
을 돌리다a
a로Maybe a
그리고<*>
Maybe 함수를 Maybe 값에 적용.유형에 Maybe 적용 방법 사용a
유형 값으로 조작할 수 있게 하다.a
오류는 적용 기계에 의해 자동으로 처리된다.예를 들어, 추가하기m :: Maybe Int
그리고n :: Maybe Int
, 쓰기만 하면 된다.
(+) <$$BODY$$gt; m <*> n
오류가 아닌 경우, 추가m=Just i
그리고n=Just j
주다Just(i+j)
. 다음 중 하나일 경우m
또는n
이다Nothing
, 그러면 결과는Nothing
또한 이 예는 응용 프로그램들이 어떻게 일반화된 기능 적용을 허용하는지 보여준다.
참고 항목
참조
- ^ McBride, Conor; Paterson, Ross (2008-01-01). "Applicative programming with effects". Journal of Functional Programming. 18 (1): 1–13. CiteSeerX 10.1.1.114.1555. doi:10.1017/S0956796807006326. ISSN 1469-7653.
- ^ a b Hutton, Graham (2016). Programming in Haskell (2 ed.). pp. 157–163.
- ^ a b c "Control.Applicative".