Подтвердить что ты не робот

Почему IO - монада вместо комонада?

Вывод - это эффективное вычисление. Таким образом, имеет смысл инкапсулировать его в монаду. Но вход - это контекстно-зависимое вычисление. Таким образом, было бы более целесообразно инкапсулировать его в comonad.

Однако в Haskell ввод и вывод инкапсулированы в монаду IO. Зачем?

4b9b3361

Ответ 1

У comonad есть метод extract :: w a -> a, который не может быть (разумно) реализован для IO.

Ввод не очень чувствителен к контексту в смысле comonad. "Контекстная чувствительность" для comonad означает, что она чувствительна к большему контексту в структуре данных. Например, список-молния похож на список с дополнительной информацией о положении "где мы находимся" в списке в любой момент. Фактически структура структуры IO не существует, поэтому нет никакого контекста для ее чувствительности.

Структура Monad позволяет нам получить доступ к входу изнутри IO, используя операцию >>=, поэтому все работает нормально.

Также обратите внимание, что термины "эффектный" и "контекстно-зависимый" являются неформальными и, как результат, могут не иметь полного смысла для всех примеров монадов и комонад: действительно ли функция monad "эффективна"? Является ли (,) e comonad действительно "контекстно-зависимым"?

Кстати, лучший способ развить интуицию о том, как работают монады и комонады, - это получить опыт, используя их (это касается и многих других вещей). К сожалению, на самом деле нет хорошего способа суммировать их с помощью короткой фразы типа "эффектный" или "чувствительный к контексту" таким образом, чтобы дать вам представление о том, как они на самом деле работают. Эти фразы могут помочь некоторым, но важно помнить об их ограничениях.

Кроме того, лучший способ понять класс типа - понять его экземпляры (попробуйте пройти через все предоставленные экземпляры и выяснить их). Как только вы это сделаете, вы можете посмотреть, как класс типа соединяется со всеми из них. Это обеспечит вам хорошую интуицию того, что означает тип класса. Я должен также указать, что рекомендуется придерживаться каких-либо законов, которые могут быть предоставлены для класса типа в глубине вашего ума (по крайней мере) при просмотре его экземпляров.

Ответ 2

Подпись comonad extract :: w a -> a означает, что мы можем вычислить a с чистым вычислением без каких-либо побочных эффектов.

С другой стороны, мы используем IO, когда хотим получить какое-то значение, используя побочные эффекты. Даже вещи, которые кажутся вводными, имеют только побочные эффекты. Например: получение данных по сети, чтение байтов из файла и продвижение позиции потока, чтение данных из базы данных может иметь побочные эффекты, такие как открытие сетевого подключения, регистрация доступа, активация некоторых триггеров и т.д. Так что comonad не правильная абстракция для IO.