LINUX.ORG.RU

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

Исправление quasimoto, (текущая версия) :

Например, если у тебя есть чистый код и аппликативный функтор IO

Хорошо, вот выхлоп GHCi:

Prelude> :m + Control.Applicative
Prelude Control.Applicative> :i IO
...
instance Monad IO -- Defined in `GHC.Base'
instance Functor IO -- Defined in `GHC.Base'
instance Applicative IO -- Defined in `Control.Applicative'
Prelude Control.Applicative> fmap id (print 1)
1
Prelude Control.Applicative> print 1 *> print 2
1
2
Prelude Control.Applicative> print 1 >> print 2
1
2
Prelude Control.Applicative> do { print 1 ; print 2 }
1
2
Prelude Control.Applicative> getLine >>= \line -> print (1 + read line)
1
2
Prelude Control.Applicative> do { line <- getLine ; print (1 + read line) }
1
2
Prelude Control.Applicative> print 1 . print 2

<interactive>:4:1:
    Couldn't match expected type `b0 -> c' with actual type `IO ()'
    Relevant bindings include it :: a -> c (bound at <interactive>:4:1)
    Possible cause: `print' is applied to too many arguments
    In the first argument of `(.)', namely `print 1'
    In the expression: print 1 . print 2

<interactive>:4:11:
    Couldn't match expected type `a -> b0' with actual type `IO ()'
    Relevant bindings include it :: a -> c (bound at <interactive>:4:1)
    Possible cause: `print' is applied to too many arguments
    In the second argument of `(.)', namely `print 2'
    In the expression: print 1 . print 2
Prelude Control.Applicative> :m + Control.Monad
Prelude Control.Applicative Control.Monad> ((const $ print 1) >=> (const $ print 2)) ()
1
2
Prelude Control.Applicative Control.Monad> ((const $ print 1) . (const $ print 2)) ()
1
Prelude Control.Applicative Control.Monad> :m + Control.Arrow
Prelude Control.Applicative Control.Monad Control.Arrow> ((const $ print 1) >>> (const $ print 2)) ()
2

Не понятно — 1) каким боком тут fmap и обычная композиция — или напиши как fmap и/или (.) использовать в качестве _;_, 2) таки для настоящей _;_ которая фигурирует в T x = Con(); use(x) и x <- con; use x нужна монада, то есть (>>=) — или напиши как такое сделать используя только Applicative ((*>), (<*>), pure).

1) Только если вот такое:

> runKleisli ((Kleisli $ const $ print 2) . (Kleisli $ const $ print 1)) ()
1
2
> runKleisli ((Kleisli $ const $ print 1) >>> (Kleisli $ const $ print 2)) ()
1
2

не обычная композиция (другой категории).

Нет, они как раз про то же.

Они не дают произвольных DSL, как макросы. Монадические DSL (типа free monad, например) и синтаксические макросов — разные вещи. Вообще монады это функциональщина, приделывать к ним DSL макросами или делать сахар сразу в синтаксисе языка — совсем другой вопрос.

мы можем свернуть код при помощи do-нотации

А можем не сворачивать — http://www.haskell.org/haskellwiki/Do_notation_considered_harmful.

Нету.

Обычное математическое определение применительно к эндофункторам на категории типов.

В частности, ни в одном из мейнстримных ЯП типов нету. В том числе и в статически типизированных, да. Там есть нечто, что мы называем типами, но оно совершенно точно не удовлетворяет определению «типа». Соответсвенно, нету там и монад (и быть не может).

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.59.8232

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.124.5712

Либо рассматриваем воображаемое подмножество языка в котором «всё хорошо», либо теория семантических доменов с монадами под разные модели вычислений во все поля.ф

Исправление quasimoto, :

Например, если у тебя есть чистый код и аппликативный функтор IO

Хорошо, вот выхлоп GHCi:

Prelude> :m + Control.Applicative
Prelude Control.Applicative> :i IO
...
instance Monad IO -- Defined in `GHC.Base'
instance Functor IO -- Defined in `GHC.Base'
instance Applicative IO -- Defined in `Control.Applicative'
Prelude Control.Applicative> fmap id (print 1)
1
Prelude Control.Applicative> print 1 *> print 2
1
2
Prelude Control.Applicative> print 1 >> print 2
1
2
Prelude Control.Applicative> do { print 1 ; print 2 }
1
2
Prelude Control.Applicative> getLine >>= \line -> print (1 + read line)
1
2
Prelude Control.Applicative> do { line <- getLine ; print (1 + read line) }
1
2
Prelude Control.Applicative> print 1 . print 2

<interactive>:4:1:
    Couldn't match expected type `b0 -> c' with actual type `IO ()'
    Relevant bindings include it :: a -> c (bound at <interactive>:4:1)
    Possible cause: `print' is applied to too many arguments
    In the first argument of `(.)', namely `print 1'
    In the expression: print 1 . print 2

<interactive>:4:11:
    Couldn't match expected type `a -> b0' with actual type `IO ()'
    Relevant bindings include it :: a -> c (bound at <interactive>:4:1)
    Possible cause: `print' is applied to too many arguments
    In the second argument of `(.)', namely `print 2'
    In the expression: print 1 . print 2
Prelude Control.Applicative> :m + Control.Monad
Prelude Control.Applicative Control.Monad> ((const $ print 1) >=> (const $ print 2)) ()
1
2
Prelude Control.Applicative Control.Monad> ((const $ print 1) . (const $ print 2)) ()
1
Prelude Control.Applicative Control.Monad> :m + Control.Arrow
Prelude Control.Applicative Control.Monad Control.Arrow> ((const $ print 1) >>> (const $ print 2)) ()
2

Не понятно — 1) каким боком тут fmap и обычная композиция — или напиши как fmap и/или (.) использовать в качестве _;_, 2) таки для настоящей _;_ которая фигурирует в T x = Con(); use(x) и x <- con; use x нужна монада, то есть (>>=) — или напиши как такое сделать используя только Applicative ((*>), (<*>), pure).

1) Только если вот такое:

Prelude Control.Applicative Control.Monad Control.Arrow Control.Category> runKleisli ((Kleisli $ const $ print 2) . (Kleisli $ const $ print 1)) ()
1
2

не обычная композиция (другой категории).

Нет, они как раз про то же.

Они не дают произвольных DSL, как макросы. Монадические DSL (типа free monad, например) и синтаксические макросов — разные вещи. Вообще монады это функциональщина, приделывать к ним DSL макросами или делать сахар сразу в синтаксисе языка — совсем другой вопрос.

мы можем свернуть код при помощи do-нотации

А можем не сворачивать — http://www.haskell.org/haskellwiki/Do_notation_considered_harmful.

Нету.

Обычное математическое определение применительно к эндофункторам на категории типов.

В частности, ни в одном из мейнстримных ЯП типов нету. В том числе и в статически типизированных, да. Там есть нечто, что мы называем типами, но оно совершенно точно не удовлетворяет определению «типа». Соответсвенно, нету там и монад (и быть не может).

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.59.8232

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.124.5712

Либо рассматриваем воображаемое подмножество языка в котором «всё хорошо», либо теория семантических доменов с монадами под разные модели вычислений во все поля.ф

Исходная версия quasimoto, :

Например, если у тебя есть чистый код и аппликативный функтор IO

Хорошо, вот выхлоп GHCi:

Prelude> :m + Control.Applicative
Prelude Control.Applicative> :i IO
...
instance Monad IO -- Defined in `GHC.Base'
instance Functor IO -- Defined in `GHC.Base'
instance Applicative IO -- Defined in `Control.Applicative'
Prelude Control.Applicative> fmap id (print 1)
1
Prelude Control.Applicative> print 1 *> print 2
1
2
Prelude Control.Applicative> print 1 >> print 2
1
2
Prelude Control.Applicative> do { print 1 ; print 2 }
1
2
Prelude Control.Applicative> getLine >>= \line -> print (1 + read line)
1
2
Prelude Control.Applicative> do { line <- getLine ; print (1 + read line) }
1
2
Prelude Control.Applicative> print 1 . print 2

<interactive>:4:1:
    Couldn't match expected type `b0 -> c' with actual type `IO ()'
    Relevant bindings include it :: a -> c (bound at <interactive>:4:1)
    Possible cause: `print' is applied to too many arguments
    In the first argument of `(.)', namely `print 1'
    In the expression: print 1 . print 2

<interactive>:4:11:
    Couldn't match expected type `a -> b0' with actual type `IO ()'
    Relevant bindings include it :: a -> c (bound at <interactive>:4:1)
    Possible cause: `print' is applied to too many arguments
    In the second argument of `(.)', namely `print 2'
    In the expression: print 1 . print 2
Prelude Control.Applicative> :m + Control.Monad
Prelude Control.Applicative Control.Monad> ((const $ print 1) >=> (const $ print 2)) ()
1
2
Prelude Control.Applicative Control.Monad> ((const $ print 1) . (const $ print 2)) ()
1
Prelude Control.Applicative Control.Monad> :m + Control.Arrow
Prelude Control.Applicative Control.Monad Control.Arrow> ((const $ print 1) >>> (const $ print 2)) ()
2

Не понятно — 1) каким боком тут fmap и обычная композиция — или напиши как fmap и/или (.) использовать в качестве _;_, 2) таки для настоящей _;_ которая фигурирует в T x = Con(); use(x) и x <- con; use x нужна монада, то есть (>>=) — или напиши как такое сделать используя только Applicative ((*>), (<*>), pure).

Нет, они как раз про то же.

Они не дают произвольных DSL, как макросы. Монадические DSL (типа free monad, например) и синтаксические макросов — разные вещи. Вообще монады это функциональщина, приделывать к ним DSL макросами или делать сахар сразу в синтаксисе языка — совсем другой вопрос.

мы можем свернуть код при помощи do-нотации

А можем не сворачивать — http://www.haskell.org/haskellwiki/Do_notation_considered_harmful.

Нету.

Обычное математическое определение применительно к эндофункторам на категории типов.

В частности, ни в одном из мейнстримных ЯП типов нету. В том числе и в статически типизированных, да. Там есть нечто, что мы называем типами, но оно совершенно точно не удовлетворяет определению «типа». Соответсвенно, нету там и монад (и быть не может).

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.59.8232

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.124.5712

Либо рассматриваем воображаемое подмножество языка в котором «всё хорошо», либо теория семантических доменов с монадами под разные модели вычислений во все поля.ф