你能根据`Monads`来定义`Comonads`吗?

时间:2015-12-16 01:39:21

标签: haskell transform monads comonad

好的,让我们说你有类型

newtype Dual f a = Dual {dual :: forall r. f(a -> r)->r}

事实证明,当f是Comonad时,Dual f是Monad(有趣的练习)。它是否相反?

您可以定义fmap ab (Dual da) = Dual $ \fb -> da $ fmap (. ab) fbextract (Dual da) = da $ return id,但我不知道如何定义duplicateextend

这甚至可能吗?如果没有,那么证明不存在(是否有一个特定的Monad m可以证明Dual m不是comonad)?

一些观察: Dual IO a基本上是Void(而Const Void是有效的Comonad)。 Dual m a MonadPlus m Void(只需使用dual mzero)。 Dual ReaderEnvDual WriterTraced。 我认为Dual StateStore

1 个答案:

答案 0 :(得分:4)

是的,实际上任何仿函数都会以这种方式产生一个独特的comonad,除非f == 0。

让F成为Hask的endofunctor。让

W(a) = ∀r.F(a->r)->r
W(f) = F(f∗)∗
       where g∗(h) = h∘g

一旦你意识到以下同构,这个难题就会变成几何/组合:

定理1。

假设两种类型(∀r.r-> F(r))(∀r.F(r) - > r)都不为空。然后存在类型W(a)is(∀r.F(r) - > r,a)的同构。

证明:
class Functor f => Fibration f where
        projection   :: ∀r. f(r)->r
        some_section :: ∀r. r->f(r) -- _any_ section will work

to :: forall f a. Fibration f
      => (∀r.f(a->r) -> r)
      -> (∀r.f(r)->r, a)
to(f) = ( f . fmap const
        , f(some_section(id)))

from :: forall f a. Fibration f
        => (∀r.f(r)->r, a)
        -> (∀r.f(a->r) -> r)
from (π,η) = ev(η) . π

ev :: a -> (a->b) -> b
ev x f = f x

填写详细信息(我可以根据要求发布)将需要 一点参数和Yoneda引理。当F不是一个Fibration(如我在上面定义的那样)时,W就像你观察到的那样是微不足道的。

如果投影是唯一的,我们可以将纤维化称为覆盖(虽然我不确定这种用法是否合适)。

承认这个定理,你可以看到W(a)是_所有可能的纤维化指数的副产品∀r.F(r) - > r,即

W(a) ≃ ∐a
       π::∀f.F(r)->r

换句话说,仿函数W(作为Func(Hask)上的一个预言)采取纤维化并从中构造一个规范的平凡覆盖空间。

例如,让F(a)=(Int,a,a,a)。然后我们有三个明显的自然纤维F(a) - > a。用+编写副产品,下面的图表和上面的定理应该足以具体描述这些共同产品:

           a
           ^
           | ε
           |
         a+a+a
        ^  |  ^
     Wε |  |δ | εW
        |  v  |
(a+a+a)+(a+a+a)+(a+a+a)

所以这个议案是独一无二的。在副产品中使用明显的指数,Wε将(i,j)映射到j,εW映射(i,j)到i。因此δ必须是唯一的“对角线”映射,即δ(i)==(i,i)!

定理2。

设F为一个Fibration,让ΩW为所有comonad与底层仿函数W的集合。然后ΩW≃1。

(对不起,我还没有将证明正式化。)

对于该组monadMW的类似组合论证也将是有趣的,但是在这种情况下,MW可能不是单身。 (取一些常数c并设置η:1-> c和μ(i,j)= i + j-c。)

请注意,如此构造的monads / comonads通常原始comonads / monads的双重符号。例如,让M成为monad (F(a)=(Int,a),η(x)=(0,x),μ(n,(m,x))=(n + m,x)),即Writer 。由于定理W(a)≃a,自然投影是唯一的,并且没有办法尊重原始代数。

另请注意,comonad通常是一种Fibration(可能有许多不同的方式),除非Void,这就是为什么你从Comonad获得Monad(但这不一定是唯一的!)。

关于你观察的一些评论:

  • Dual IO a基本上是虚空

    据我所知,在Haskell中IO的定义如下:

      -- ghc/libraries/ghc-prim/GHC/Types.hs
     newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
    

    这意味着仅从类型理论中相应的覆盖是由所有State# RealWorld s索引的唯一规范覆盖空间。你是否可以(或应该)拒绝这可能是一个哲学问题,而不是技术问题。

  • MonadPlus m => Dual m a是Void

    是的,但请注意,如果F(a)= 0,那么W(a)= 1并且它不是comonad(因为否则该指示意味着类型W(0) - > 0≃1-> 0)。这是唯一一个W甚至不能成为任意仿函数的小事情的情况。

  • Dual Reader是...... 这些陈述有时是正确的,有时不是。取决于(co)代数代数是否与覆盖的(bi)代数一致。

所以我很惊讶几何Haskell真的很有趣!我猜可能有很多类似于此的几何结构。例如,对此的自然概括是考虑对于一些协变函子F,G的F-> G的“规范平凡化”。那么基本空间的自同构群将不再是微不足道的,因此需要更多的理论来正确理解它。

最后,这是一个概念证明代码。感谢一个非常令人耳目一新的谜题,并祝圣诞快乐; - )

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}

import Control.Comonad

class Functor f => Fibration f where
        x0 :: f ()
        x0 = some_section ()

        some_section :: forall r. r -> f(r)
        some_section x = fmap (const x) x0

        projection :: forall r. f(r) -> r

newtype W f a = W { un_w :: forall r. f(a->r)->r }

instance Functor f =>  Functor (W f) where
        fmap f (W c) = W $ c . fmap (. f)

instance Fibration f => Comonad (W f) where
        extract = ε
        duplicate = δ

-- The counit is determined uniquely, independently of the choice of a particular section.
ε :: forall f a. Fibration f => W f a -> a
ε (W f) = f (some_section id)

-- The comultiplication is unique too.
δ :: forall f a. Fibration f => W f a -> W f (W f a)
δ f = W $ ev(f) . un_w f . fmap const

ev :: forall a b. a -> (a->b)->b
ev x f = f x

-- An Example
data Pair a = P {p1 ::a
                ,p2 :: a
                 }
               deriving (Eq,Show)

instance Functor Pair where
        fmap f (P x y) = P (f x)  (f y)

instance Fibration Pair where
        x0 = P () ()
        projection = p1

type PairCover a = W Pair a

-- How to construct a cover (you will need unsafePerformIO if you want W IO.)
cover :: a -> W Pair a
cover x = W $ ev(x) . p1