LINUX.ORG.RU

История изменений

Исправление 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.