Monad都是可区分的类型

Cir*_*dec 19 monads haskell zipper deriving

鉴于可区分的类型,我们知道Zipper是一个Comonad.对此,Dan Burton问道,"如果衍生产生了一个共同点,这是否意味着整合会产生一个单子?或者这是无意义的?".我想给这个问题一个特定的含义.如果类型是可区​​分的,它是否必然是monad?考虑到以下定义,问题的一个表述是要问

data Zipper t a = Zipper { diff :: D t a, here :: a }

deriving instance Diff t => Functor (Zipper t)

class (Functor t, Functor (D t)) => Diff t where
    type D t :: * -> *
    up :: Zipper t a -> t a
    down :: t a -> t (Zipper t a)
Run Code Online (Sandbox Code Playgroud)

我们可以编写类似于签名的函数吗?

return :: (Diff t) => a -> t a
(>>=) :: (Diff t) => t a -> (a -> t b) -> t b
Run Code Online (Sandbox Code Playgroud)

遵守Monad法律.

在回答链接的问题,有两个成功的方法来获得的类似问题Comonad的实例Zipper.第一种方法是扩展Diff该类以包括双重>>=和使用部分区分.第二种方法是要求类型为两次或无限可微.

Sjo*_*her 5

不可以.虚空函子data V a是可微分的,但return不能实现它.