Основы функционального программирования/Haskell/Модули и монады: различия между версиями

Содержимое удалено Содержимое добавлено
мНет описания правки
Строка 155:
== Ответы для самопроверки ==
 
#1. Первое, что приходит в голову это то, что монада — это контейнерный тип. Ведь действительно, список — это контейнерный тип, т. к. внутри списка содержатся элементы другого типа. Именно это и показано в определении монадического типа:
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
 
<code>class Monad m where
Запись «m a» как бы показывает, что тип a (необходимо чётко помнить, что при определении классов и других типов данных символы типа a, b и т.д. обозначают переменные типов) обрамлён монадическим типом m. Однако в реальности физическое обрамление доступно только для монадического типа «список», т.к. его обозначение в виде квадратных скобок пошло традиционно. В строгой нотации Haskell’а нужно было бы писать что-нибудь вроде: List (1 2 3 4 5) — это список [1, 2, 3, 4, 5].
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a</code>
 
Запись «<code>m a</code>» как бы показывает, что тип <code>a</code> (необходимо чётко помнить, что при определении классов и других типов данных символы типа <code>a</code>, <code>b</code> и &nbsp;т.&nbsp;д. обозначают переменные типов) обрамлён монадическим типом <code>m</code>. Однако в реальности физическое обрамление доступно только для монадического типа «список», т.&nbsp;к. его обозначение в виде квадратных скобок пошло традиционно. В строгой нотации Haskell’аХаскела нужно было бы писать что-нибудь вроде: <code>List (1 2 3 4 5)</code> — это список <code>[1, 2, 3, 4, 5]</code>.
#Применение монад в функциональных языках — это по существу возвращение к императивности. Ведь операции связывания (>>=) и (>>) предполагают последовательное выполнение связанных выражений с передачей или без результатов вычисления. Т.е. монады — это императивное ядро внутри функциональных языков. С одной стороны это идёт в разрез с теорией функционального програмирования, где отрицается понятие императивности, но с другой стороны некоторые задачи решаются только при помощи императивных принципов. И опять же, Haskell предоставляет удивительную возможность по генерации списков, но это только благодаря тому, что сам тип «список» выполнен в виде монады.
 
#2.&nbsp;Применение монад в функциональных языках — это по существу возвращение к императивности. Ведь операции связывания (<code>>>=</code>) и (<code>>></code>) предполагают последовательное выполнение связанных выражений с передачей или без результатов вычисления. Т.&nbsp;е. монады — это императивное ядро внутри функциональных языков. С одной стороны это идёт в разрез с теорией функционального програмирования, где отрицается понятие императивности, но с другой стороны некоторые задачи решаются только при помощи императивных принципов. И опять же, HaskellХаскел предоставляет удивительную возможность по генерации списков, но это только благодаря тому, что сам тип «список» выполнен в виде монады.