История изменений
Исправление quasimoto, (текущая версия) :
; - это аппликативный функтор
«Функтор», «точечный функтор», «аппликативный функтор» или «монада» это всё по отношению к типу * -> * говорят, то есть эндофунктору на категории типов. Можно сказать «List это аппликативный функтор» или «List это монада», но никак не "; - это аппликативный функтор".
; это функция, если уж на то пошло. Ты хотел сказать, что это (*>) :: f a -> f b -> f b (из Control.Applicative, для некоторого аппликативного функтора f :: * -> *)? Ещё раз:
T x = con(...) ; use(x)
con(...) >>= \(x :: T) -> use(x)
То есть (>>=), не (*>).
То есть это просто синтаксический сахарок, который подставляет >>= вместо ;
Да, что характерно — ; заменим (>>=), то есть монадической операцией, а не аппликативной (иначе бы в хаскелях и скалах скакали вокруг аппликативных функторов, а не монад).
Давай уж будет говорить о языковых возможностях с точностью до синтаксического сахара?
Не, ну речь была про ; — сахар для (>>=), ок. Что Вадлер сказал — примерно «как нам в чистом языке запилить императивщину? С помощью монад, то есть (>>=), то есть программируемого ;», так же оказывается, что сам этот интерфейс более общий и подходит для самых разных типов.
Конечно, можно - если есть макросы
Мандады на макаросах и борщесиле, ага.
Если у нас есть нечто, для чего можно определить bind/return с нужными типами удовлетворяющее монадическими законами - оно монадой не становится
Становится, по определению. Вот, например, List, Option или Future — монады.
Вообще http://www.scala-lang.org/api/current/index.html#scala.collection.TraversableOnce$$MonadOps@inheritance-diagram — implicitly 328 classes/traits.
Исходная версия quasimoto, :
; - это аппликативный функтор
«Функтор», «точечный функтор», «аппликативный функтор» или «монада» это всё по отношению к типу * -> * говорят, то есть эндофунктору на категории типов. Можно сказать «List это аппликативный функтор» или «List это монада», но никак не "; - это аппликативный функтор".
; это функция, если уж на то пошло. Ты хотел сказать, что это (*>) :: f a -> f b -> f b (из Control.Applicative, для некоторого аппликативного функтора f :: * -> *)? Ещё раз:
T x = con(...) ; use(x)
con(...) >>= \(x :: T) -> use(x)
То есть (>>=), не (*>).
То есть это просто синтаксический сахарок, который подставляет >>= вместо ;
Да, что характерно — ; заменим (>>=), то есть монадической операцией, а не аппликативной (иначе бы в хаскелях и скалах скакали вокруг аппликативных функторов, а не монад).
Давай уж будет говорить о языковых возможностях с точностью до синтаксического сахара?
Не, ну речь была про ; — сахар для (>>=), ок. Что Вадлер сказал — примерно «как нам в чистом языке запилить императивщину? С помощью монад, то есть (>>=), то есть программируемого ;», так же оказывается, что сам этот интерфейс более общий и подходит для самых разных типов.
Конечно, можно - если есть макросы
Мандады на макаросах и борщесиле, ага.
Если у нас есть нечто, для чего можно определить bind/return с нужными типами удовлетворяющее монадическими законами - оно монадой не становится
Становится, по определению. Вот, например, List, Option или Future — монады.
Вообще http://www.scala-lang.org/api/current/index.html#scala.collection.Traversable...$$MonadOps@inheritance-diagram — implicitly 328 classes/traits.