Applicative
typeclass을 나타내는 LAX monoidal 펑 해당 입력 기능의 범주에 직교 monoidal 구조를 유지.
다시 말해서, (,)
단일체 구조 를 형성하는 표준 동 형사상이 주어지면 :
-- Implementations left to the motivated reader
assoc_fwd :: ((a, b), c) -> (a, (b, c))
assoc_bwd :: (a, (b, c)) -> ((a, b), c)
lunit_fwd :: ((), a) -> a
lunit_bwd :: a -> ((), a)
runit_fwd :: (a, ()) -> a
runit_bwd :: a -> (a, ())
타입 클래스와 그 법칙은 다음과 같이 작성 될 수 있습니다 :
class Functor f => Applicative f
where
zip :: (f a, f b) -> f (a, b)
husk :: () -> f ()
-- Laws:
-- assoc_fwd >>> bimap id zip >>> zip
-- =
-- bimap zip id >>> zip >>> fmap assoc_fwd
-- lunit_fwd
-- =
-- bimap husk id >>> zip >>> fmap lunit_fwd
-- runit_fwd
-- =
-- bimap id husk >>> zip >>> fmap runit_fwd
동일한 구조와 관련하여 오플 렉서 일체형 의 펑터가 어떻게 보일지 궁금 할 것입니다.
class Functor f => OpApplicative f
where
unzip :: f (a, b) -> (f a, f b)
unhusk :: f () -> ()
-- Laws:
-- assoc_bwd <<< bimap id unzip <<< unzip
-- =
-- bimap unzip id <<< unzip <<< fmap assoc_bwd
-- lunit_bwd
-- =
-- bimap unhusk id <<< unzip <<< fmap lunit_bwd
-- runit_bwd
-- =
-- bimap id unhusk <<< unzip <<< fmap runit_bwd
정의와 법에 관련된 유형에 대해 생각하면 실망스러운 진실이 드러납니다. OpApplicative
다음보다 더 구체적인 제약은 없습니다 Functor
.
instance Functor f => OpApplicative f
where
unzip fab = (fst <$> fab, snd <$> fab)
unhusk = const ()
그러나 모든 Applicative
functor (실제로 any Functor
)는 사소한 것이지만, laxities 와 oplaxities OpApplicative
사이에 반드시 좋은 관계가있는 Applicative
것은 OpApplicative
아닙니다. 따라서 직교 일측 체 구조를 갖는 강력한 일 측성 펑터를 찾을 수 있습니다 .
class (Applicative f, OpApplicative f) => StrongApplicative f
-- Laws:
-- unhusk . husk = id
-- husk . unhusk = id
-- zip . unzip = id
-- unzip . zip = id
위의 첫 번째 법칙은 사소한 데, 그 유형의 유일한 거주자 () -> ()
는의 신분 함수입니다 ()
.
그러나 나머지 세 가지 법칙과 하위 클래스 자체는 사소한 것이 아닙니다 . 특히 모든 사람 Applicative
이이 클래스의 합법적 인 사례는 아닙니다 .
다음은 Applicative
합법적 인 사례를 선언 할 수있는 몇 가지 기능 입니다 StrongApplicative
.
Identity
VoidF
(->) r
(답변 참조)Monoid m => (,) m
Vec (n :: Nat)
Stream
(무한대)
그리고 여기에 Applicative
우리가 할 수없는 것들이 있습니다 :
[]
Either e
Maybe
NonEmptyList
패턴은 여기에 제안 StrongApplicative
클래스는 의미 인 FixedSize
"고정 크기"클래스, * 수단은 다양성 것을 ** 의 주민 a
의 주민에이 f a
고정됩니다.
이것은 두 가지 추측으로 언급 될 수 있습니다.
Applicative
유형 인수의 요소로 구성된 "고정 크기"컨테이너를 나타내는 모든 것은StrongApplicative
StrongApplicative
발생 횟수가a
다를 수있는 인스턴스가 없습니다.
누구나 이러한 추측을 반증하는 반례, 또는 그것이 참인지 거짓인지를 보여주는 설득력있는 추론을 생각할 수 있습니까?
* 형용사 "고정 크기"를 올바르게 정의하지 않았다는 것을 알고 있습니다. 불행히도 작업은 약간 순환 적입니다. 나는 "고정 크기"컨테이너에 대한 공식적인 설명을 모른다. StrongApplicative
지금까지 최선의 시도입니다.
그러나 이것이 좋은 정의인지 평가하려면 비교할 것이 필요합니다. functor가 형식 인수의 거주자와 관련하여 주어진 크기 또는 다중성을 갖는 것이 무엇을 의미하는지에 대한 공식 / 비공식적 정의를 감안할 때, 문제는 실체의 존재 StrongApplicative
가 고정되고 다양한 크기의 functor를 정확하게 구별 하는지 여부 입니다.
기존의 공식적인 정의를 알지 못하고 "고정 크기"라는 용어를 사용하면서 직감에 호소하고 있습니다. 그러나 누군가가 이미 functor의 크기에 대한 기존 형식을 알고 StrongApplicative
그것을 비교할 수 있다면 훨씬 좋습니다.
** "다중성 (multiplicity)"이란 용어는 functor의 코 도메인 유형의 거주자에서 functor의 매개 변수 유형의 임의 요소가 "얼마나 많은"지를 의미합니다. 이다 없이 펑이 적용되는 특정 유형에 대하여, 따라서 파라미터 유형의 특정 주민 관계없이.
이것에 대해 정확하지 않으면 주석에 약간의 혼란이 생겼으므로 다음은 다양한 펑터의 크기 / 다중성을 다음과 같이 고려할 수있는 몇 가지 예입니다.
VoidF
: 고정, 0Identity
: 고정, 1Maybe
: 변수, 최소 0, 최대 1[]
: 변수, 최소 0, 최대 무한NonEmptyList
: 가변, 최소 1, 최대 무한Stream
: 고정, 무한Monoid m => (,) m
: 고정, 1data Pair a = Pair a a
: 고정, 2Either x
: 변수, 최소 0, 최대 1data Strange a = L a | R a
: 고정, 1
(->) r
입니다.
(->) r
. 강력한 적용 구조를 유지하려면 동형의 구성 요소가 필요합니다. 어떤 이유로 Representable
하스켈 typeclass 신비한가 tabulate . return = return
(정말 심지어 비 모나드 펑터에 대한 이해가되지 않습니다) 법을, 그러나 그것은 우리에게 우리가 그런 말을하는 데 필요한 조건의 1/4 제공 tabulate
하고 zip
monoids의 적절한 카테고리의 morphisms됩니다 . 다른 3 가지 규칙은 추가로 요구되는 법률입니다.
tabulate
와 index
... 적절한 카테고리의 morphisms입니다"
return
것은 심각한 문제가 아니라는 것이 밝혀졌습니다 . cotraverse getConst . Const
는 return
/ pure
의 관점에서 기본 구현이며 Distributive
배포자 / 표현자가 고정 된 모양을 갖기 때문에 해당 구현은 고유합니다.