すべての固定サイズのコンテナ強いmonoidalファンクタを、および/またはその逆はありますか?

アサドSaeeduddin:

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、との素敵な関係は必ずしもありませんApplicativelaxitiesとOpApplicativeoplaxitiesが。我々はを探すことができますので、強い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:固定、0
  • Identity:固定、1
  • Maybe:変数、最小値0、最大1
  • []:変数、最小値0、最大無限
  • NonEmptyList:変数、最小1、最大無限
  • Stream:固定、無限
  • Monoid m => (,) m:固定、1
  • data Pair a = Pair a a:固定、2
  • Either x:変数、最小値0、最大1
  • data Strange a = L a | R a:固定、1
bradrn:
  • すべての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固定形状のものでなければなりません。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=377093&siteId=1