Ответ 1
У comonad есть метод extract :: w a -> a
, который не может быть (разумно) реализован для IO
.
Ввод не очень чувствителен к контексту в смысле comonad. "Контекстная чувствительность" для comonad означает, что она чувствительна к большему контексту в структуре данных. Например, список-молния похож на список с дополнительной информацией о положении "где мы находимся" в списке в любой момент. Фактически структура структуры IO
не существует, поэтому нет никакого контекста для ее чувствительности.
Структура Monad
позволяет нам получить доступ к входу изнутри IO
, используя операцию >>=
, поэтому все работает нормально.
Также обратите внимание, что термины "эффектный" и "контекстно-зависимый" являются неформальными и, как результат, могут не иметь полного смысла для всех примеров монадов и комонад: действительно ли функция monad "эффективна"? Является ли (,) e
comonad действительно "контекстно-зависимым"?
Кстати, лучший способ развить интуицию о том, как работают монады и комонады, - это получить опыт, используя их (это касается и многих других вещей). К сожалению, на самом деле нет хорошего способа суммировать их с помощью короткой фразы типа "эффектный" или "чувствительный к контексту" таким образом, чтобы дать вам представление о том, как они на самом деле работают. Эти фразы могут помочь некоторым, но важно помнить об их ограничениях.
Кроме того, лучший способ понять класс типа - понять его экземпляры (попробуйте пройти через все предоставленные экземпляры и выяснить их). Как только вы это сделаете, вы можете посмотреть, как класс типа соединяется со всеми из них. Это обеспечит вам хорошую интуицию того, что означает тип класса. Я должен также указать, что рекомендуется придерживаться каких-либо законов, которые могут быть предоставлены для класса типа в глубине вашего ума (по крайней мере) при просмотре его экземпляров.