Applicative
型クラスは、型指定された機能のカテゴリにデカルトmonoidal構造を保持ずさん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
一つは、ある関手何か疑問に思うかもしれませんoplax同じ構造に関してmonoidalは、次のようになります。
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
これ以上の具体的なA制約よりもですFunctor
。
instance Functor f => OpApplicative f
where
unzip fab = (fst <$> fab, snd <$> fab)
unhusk = const ()
あらゆるながらしかし、Applicative
ファンクタ(実際に、任意のはFunctor
)自明であるOpApplicative
、との素敵な関係は必ずしもありませんApplicative
laxitiesとOpApplicative
oplaxitiesが。我々はを探すことができますので、強いmonoidalファンクタデカルトmonoidal構造をWRT:
class (Applicative f, OpApplicative f) => StrongApplicative f
-- Laws:
-- unhusk . husk = id
-- husk . unhusk = id
-- zip . unzip = id
-- unzip . zip = id
タイプの唯一の住人がいるので上記の第一法則は、自明である() -> ()
上の恒等関数です()
。
しかし、残りの3つの法律、したがってサブクラス自体ではない些細。具体的には、必ずしもすべてがApplicative
、このクラスの合法的なインスタンスです。
ここではいくつかありApplicative
、我々は合法的なのインスタンスを宣言することができたためファンクタはStrongApplicative
:
Identity
VoidF
(->) r
-
Monoid m => (,) m
Vec (n :: Nat)
Stream
(無限)
そして、ここでいくつかありApplicative
、私たちにはできないためSは:
[]
Either e
Maybe
NonEmptyList
ここでのパターンは、ことを示唆しているStrongApplicative
クラスが意味であるFixedSize
クラス、「固定サイズ」*多重度という意味**の住民a
の住民でf a
固定されています。
これは、2つの推測として記述することができます。
- すべての
Applicative
表現の型引数の要素の「固定サイズ」容器のインスタンスでありますStrongApplicative
- インスタンスは、
StrongApplicative
その中に出現の数が存在しないa
変えることができます
誰もがこれらの推測、または彼らは真か偽である理由を示して、いくつかの説得力の推論を反証反例を考えることができますか?
*私は私がきちんと形容詞「固定サイズ」を定義していないことを実現します。残念ながら、タスクが少し円形です。私は、「固定サイズ」の容器のいずれかの形式的な記述を知りませんし、1を思い付くしようとしています。StrongApplicative
これまでの私の最高の試みです。
これはしかし、良い定義があるかどうかを評価するために、私はそれを比較するために何かを必要としています。ファンクタは、その型引数の住民に関して与えられた大きさや多様性を持っているため、それが何を意味するのか、いくつかの正式な/非公式の定義を考えると、質問はの存在かどうかであるStrongApplicative
インスタンスが正確に固定されており、様々なサイズのファンクタを区別します。
既存の正式な定義を意識していない、私は用語「固定サイズ」の私の使い方で直感にアピールを作ってるんです。しかし、誰かがすでにファンクタの大きさのために既存の形式主義を知っていると比較することができればStrongApplicative
それに、とても良いです。
**「多重度」と私は数子のパラメータ・タイプの任意の要素関手の終域タイプの住人で起こる「多くの人がどのように」に緩い意味で言及しています。これはせずファンクタが適用される特定のタイプに関して、ひいてはパラメータ・タイプのいずれかの特定の住民に関係なく。
コメントでいくつかの混乱を引き起こしたこのことについて、正確なものではないので、ここで私はあることを、様々なファンクタのサイズ/多様性を検討するもののいくつかの例です:
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
- すべての
Applicative
表現の型引数の要素の「固定サイズ」容器のインスタンスでありますStrongApplicative
- インスタンスは、
StrongApplicative
その中に出現の数が存在しないa
変えることができます誰もがこれらの推測、または彼らは真か偽である理由を示して、いくつかの説得力の推論を反証反例を考えることができますか?
私はその最初の憶測についてはよく分からない、と@AsadSaeeduddinとの協議に基づいて、それは証明することは困難である可能性が高いのですが、2番目の推測は本当です。検討し、その理由を確認するにはStrongApplicative
法律をhusk . unhusk == id
。それはすべてのために、ですx :: f ()
、husk (unhusk x) == x
。しかし、Haskellで、unhusk == const ()
ので、その法律はすべてのために言ってに相当しx :: f ()
、husk () == x
。しかし、これは順番にしかないタイプの1つの異なる値を存在することを意味f ()
二つの値があった場合:x, y :: f ()
それから、x == husk ()
とhusk () == y
そう、x == y
。唯一の可能がある場合でもf ()
値が、その後、f
一定の形状のものでなければなりません。(例えばためdata Pair a = Pair a a
、タイプの一つの値だけがあるPair ()
、これはビーイングPair () ()
が、複数種類の値が存在するMaybe ()
か、または[()]
。)したがってhusk . unhusk == id
それが意味するf
固定形状のものでなければなりません。