Учитывая differentiable type, мы знаем, что its Zipper
is a Comonad
. В ответ на это Дэн Бертон спросил: «Если вывод делает comonad, значит ли это, что интеграция делает монаду? Или это глупость?». Я хотел бы задать этот вопрос конкретному значению. Если тип дифференцируемый, это обязательно монада? одна формулировка вопроса будет просить, учитывая следующие определенияВсе типы дифференциации Monads
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)
мы можем написать функции с подписями, похожими на
return :: (Diff t) => a -> t a
(>>=) :: (Diff t) => t a -> (a -> t b) -> t b
повинуясь Monad laws.
В ответах на связанные вопросы были два успешных подхода к аналогичной проблеме получения Comonad
экземпляров для Zipper
. Первый подход - expand the Diff
class to include the dual of >>=
and use partial differentiation. Второй подход - require that the type be twice or infinitely differentiable.
Таким образом, это демонстрирует, что «быть дифференцируемым» не гарантирует, что что-то может быть «результатом интеграции». Он правильно отвечает на вопрос Сирдека, но не особенно отвечает мне. (Я не прошу ответа, просто заметив.) Производная нуля равна нулю, но неопределенный интеграл нуля не обязательно равен нулю. Это произвольная константа. –
@ DanBurton Если вы считаете, что 'Zipper' держит' D t' как производную, 'D t' является производной от' t', приводит к экземпляру 'Comonad' для' Zipper t'. Интеграция - это инверсия дифференцирования, поэтому 't' является интегралом от' D t'. Наличие производной совпадает с интегралом. Вот почему я сформулировал вопрос так, как я это сделал: 't' является/интегралом от' D t' приводит к экземпляру 'Monad' для' t'? – Cirdec
@DanBurton Мы можем сделать экземпляр «Monad» для чего-то противоположного, см. Мой новый ответ. – Cirdec