sdc*_*vvc 5 polymorphism monads haskell monoids
我注意到Writer m和Either 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 e和Writer m取决于幺给定?
我不会说这些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).