monad是作家吗?要么是绝对的双重?

sdc*_*vvc 5 polymorphism monads haskell monoids

我注意到Writer mEither emonad 之间存在双重关系.如果m是幺半群,那么

unit :: () -> m
join :: (m,m) -> m
Run Code Online (Sandbox Code Playgroud)

可以用来形成一个monad:

return is composition: a -> ((),a) -> (m,a)
join is composition: (m,(m,a)) -> ((m,m),a) -> (m,a)
Run Code Online (Sandbox Code Playgroud)

()的双重是Void(空类型),产品的双重是副产品.每种类型e都可以给出"comonoid"结构:

unit :: Void -> e
join :: Either e e -> e
Run Code Online (Sandbox Code Playgroud)

以明显的方式.现在,

return is composition: a -> Either Void a -> Either e a
join is composition: Either e (Either e a) -> Either (Either e e) a -> Either e a
Run Code Online (Sandbox Code Playgroud)

这是Either emonad.箭头遵循完全相同的模式.

问:是否可以编写一个通用的代码,就能够既作为执行Either eWriter m取决于幺给定?

Rei*_*ton 5

我不会说这些monad是绝对双重的,而是它们都是由以下结构产生的:给定一个半群类别(C,⊗,1)和C中的代数A,考虑monad将X发送给A⊗X在第一种情况下,C是Hask,⊗是×,代数是幺半群,在第二种情况下C是Hask,⊗是E(Either),而代数只是一种类型(每种类型都是代数) wrt∐以一种独特的方式 - 这就是你所说的"comonoid",虽然这通常意味着别的东西,见下文).按照惯例,我在一个假想的世界工作,其中⊥不存在,所以×实际上是一个产品,等等.对于幺半群类别,可能使用合适的类型类来捕获这种常见的泛化(我太累了,无法理解目前在这方面正在尝试做什么类别 - 并且因此同时将Writer和Either定义为monad( modulo newtypes,可能).

至于Writer m-well的分类对偶,它取决于你想要考虑的是什么,但是最可能的候选者似乎是(,)m上的comonad结构,m上没有任何条件:

instance Comonad ((,) m) where
    coreturn (m, a) = a
    cojoin (m, a) = (m, (m, a))
Run Code Online (Sandbox Code Playgroud)

(注意,这里是我们使用的地方,m是一个共生体,即我们有地图m→(),m→m×m).