好的,让我们说你有类型
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) fb
和extract (Dual da) = da $ return id
,但我不知道如何定义duplicate
或extend
。
这甚至可能吗?如果没有,那么证明不存在(是否有一个特定的Monad m
可以证明Dual m
不是comonad)?
一些观察:
Dual IO a
基本上是Void
(而Const Void
是有效的Comonad
)。
Dual m a
的MonadPlus m
是 Void
(只需使用dual mzero
)。
Dual Reader
是Env
。
Dual Writer
是Traced
。
我认为Dual State
是Store
。
答案 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