Здравствуйте, Курилка, Вы писали:
К>P. S. ждём монады на немерле?
Зачем?
У нас уже есть ComputationExpressions
Вот пример того что с этим можно делать Async в действии
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Курилка, Вы писали:
К>>P. S. ждём монады на немерле? WH>Зачем? WH>У нас уже есть ComputationExpressions WH>Вот пример того что с этим можно делать Async в действии
Ты не понял, речь про презентацию, где было бы разжёвано, что такое монады и как они в немерле реализуются. Частные примеры это, конечно, полезно, но речь о монаде как единой абстракции.
Здравствуйте, Курилка, Вы писали:
К>Ты не понял, речь про презентацию, где было бы разжёвано, что такое монады и как они в немерле реализуются. Частные примеры это, конечно, полезно, но речь о монаде как единой абстракции.
Это ты не понял.
ComputationExpressions строгое надмножество того что есть в скале.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Курилка, Вы писали:
К>>Ты не понял, речь про презентацию, где было бы разжёвано, что такое монады и как они в немерле реализуются. Частные примеры это, конечно, полезно, но речь о монаде как единой абстракции. WH>Это ты не понял. WH>ComputationExpressions строгое надмножество того что есть в скале.
Т.е. твоё заявление равнозначно по доступности презентации приведённой выше?
Ну и монады не есть множества, как минимум, и твоё определение отношения "над" для математических абстракций тоже было бы интересно увидеть.
Здравствуйте, Курилка, Вы писали:
К>Т.е. твоё заявление равнозначно по доступности презентации приведённой выше?
Мой пример по крайней мере практичный в отличии от заумных выкрутасов в той презентации.
Пойми одну простую вещь: Люди которые не знакомы с монадами посмотрят на эту презентацию и подумают что это все из пальца высасано.
А вот превращение асинхронных оперций в последовательный код уже намного интересней.
К>Ну и монады не есть множества, как минимум, и твоё определение отношения "над" для математических абстракций тоже было бы интересно увидеть.
В скале есть только две опрации bind и return (в скале его unit обозвали)
ComputationExpressions содержат еще много других полезных операций.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Курилка, Вы писали:
К>>Т.е. твоё заявление равнозначно по доступности презентации приведённой выше? WH>Мой пример по крайней мере практичный в отличии от заумных выкрутасов в той презентации. WH>Пойми одну простую вещь: Люди которые не знакомы с монадами посмотрят на эту презентацию и подумают что это все из пальца высасано. WH>А вот превращение асинхронных оперций в последовательный код уже намного интересней.
Т.е. получаем, что ты меня всёж не понял
Презентация-то как раз для людей не знакомых с монадами (хотя это уже замучаная тема).
Я не спорю, что практичные примеры вещь нужная и очень полезная.
Только вот есть заметная разница между (возможно красивым) частным примером и описание абстракции, которая обнаруживается в достаточно большом числе (в том числи и очень практических) случаев.
Но, возможно, это слишком высокий уровень абстракции и для большинства является заумью.
Здравствуйте, Курилка, Вы писали:
К>Т.е. получаем, что ты меня всёж не понял К>Презентация-то как раз для людей не знакомых с монадами (хотя это уже замучаная тема).
Нет. Эта презентация не понятно для кого.
Люди знающие монады ничего нового не узнают.
Люди не знающие сочтут монады не понятной хренью для вымученых синтетических примеров.
К>Я не спорю, что практичные примеры вещь нужная и очень полезная.
Это единственный способ заинтересовать человека.
Можно сколько угодно приводить синтетических примеров но все бестолку.
Это всеравно как объяснять крутизну функционального пограммирования на примере факториала.
К>Только вот есть заметная разница между (возможно красивым) частным примером и описание абстракции, которая обнаруживается в достаточно большом числе (в том числи и очень практических) случаев. К>Но, возможно, это слишком высокий уровень абстракции и для большинства является заумью.
Это не уровень абстракции слишком высокий, а примеры не адекватные.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Курилка, Вы писали:
К>P. S. ждём монады на немерле?
Как уже ответили, в Немерле есть computation expressions. Это синтаксический сахар для монад и моноидов. Примерно как в f#. Это выглядит даже круче, чем for-comprehension в Cкале. Вот, презентации или документации, к сожалению нет. Зато есть обобщенный макрос comp, которому все равно какая монада или моноид. С монадными трансформерами сложнее, но с ними в f# и Cкале непросто.
Здравствуйте, Курилка, Вы писали:
WH>>ComputationExpressions строгое надмножество того что есть в скале. К>Ну и монады не есть множества, как минимум, и твоё определение отношения "над" для математических абстракций тоже было бы интересно увидеть.
Тут имеется в виду, очевидно, то, что там аналог do нотации поддерживает (или может поддерживать) не только монады, но и монады с нулем, например. Как, кстати, с этим дела в Скале обстоят — я просмотрел презентацию по диагонали, но упоминания там не нашел.
Можно, например, писать так (псевдоскала):
for { case Some(x) <- foo } yield x
Т.е. может быть слева от <- паттерн и что будет, если он не сопоставится?
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Курилка, Вы писали:
К>Презентация-то как раз для людей не знакомых с монадами (хотя это уже замучаная тема).
Мне кажется, что для рядового индустриального девелопера, на которого Скала, вроде как, ориентирована презентация какая-то перегруженная. Даже это получше, не смотря на всякие хиханьки и хаханьки.
А продвинутый может нормальную статью прочитать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Проблема в том, что в дотнетных дженериках интерфейс монады не выражается.
Т.е. нельзя записать функцию, которая работает с любой монадой — для этого нужен полиморфизм более высокого ранга.
Допустим, нам нужна функция, которая поднимает бинарную операцию в монаду. Т.е. если мы поднимаем в мэйби — у нас будет вычисление, которое равно результату бинарной опирации если оба аргумента Some и None, если один или больше аргументов бинарной опирации None, а если поднимаем в список, то у нас недетерминированное вычисление:
public static Func<?, ?, ?> Lift<TX, TY, TR>( Func<TX, TY, TR> f)
{
return (? mx, ? my) => from x in mx
from y in my
select f(x, y)
}
какие типы должны быть вместо "?" ?
//псевдошарпpublic interface Monad<M> where M : * -> *
{
M<T> Return<T>(T a);
M<T2> Bind<T, TR>(M<T> a, Func<T1, M<TR>> f);
}
Это невозможно — абстрагироваться от конструктора типа дотнетные дженерики не позволяют — только от типа.
Ну а в Скале интерфейс монады записать можно:
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, Курилка, Вы писали:
WH>>>ComputationExpressions строгое надмножество того что есть в скале. К>>Ну и монады не есть множества, как минимум, и твоё определение отношения "над" для математических абстракций тоже было бы интересно увидеть.
K>Тут имеется в виду, очевидно, то, что там аналог do нотации поддерживает (или может поддерживать) не только монады, но и монады с нулем, например. Как, кстати, с этим дела в Скале обстоят — я просмотрел презентацию по диагонали, но упоминания там не нашел. K>Можно, например, писать так (псевдоскала): K>
K>for { case Some(x) <- foo } yield x
K>
K>Т.е. может быть слева от <- паттерн и что будет, если он не сопоставится?
Это вопрос? Можно. Нуль есть.
scala> for (Some(x) <- Some(1)::None::Some(2)::Nil) yield x
res0: List[Int] = List(1, 2)
Здравствуйте, Курилка, Вы писали:
[offtopic]
После тяжелого рабочего дня читаю название темы: "Монады на скАле".
Подумал что теорию категорий придумали раньше чем письменность...
[/offtopic]
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Курилка, Вы писали: G>[offtopic] G>После тяжелого рабочего дня читаю название темы: "Монады на скАле". G>Подумал что теорию категорий придумали раньше чем письменность... G>[/offtopic]
Здравствуйте, z00n, Вы писали:
Z>В вызовы filter, map, foreach и flatMap. flatMap это в точности bind.
Там написано, что
for (p <- e; p' <- e' ...) yield e''
рассахаривается в
e.flatMap { case p => for (p' <- e' ...) yield e''}
т.е. в явном виде ноль не пристутствует. Что произойдет, если паттерн case p не сопоставится? Этим как-то можно управлять в имплементации flatMap монады? Я посмотрел исходники Option и никаких признаков переопределения ноля не заметил:
def flatMap[B](f: A => Option[B]): Option[B] =
if (isEmpty) None else f(this.get)
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
K>Там написано, что K>
K>for (p <- e; p' <- e' ...) yield e''
K>
K>рассахаривается в K>
K>e.flatMap { case p => for (p' <- e' ...) yield e''}
K>
K>т.е. в явном виде ноль не пристутствует. Что произойдет, если паттерн case p не сопоставится? Этим как-то можно управлять в имплементации flatMap монады? Я посмотрел исходники Option и никаких признаков переопределения ноля не заметил: K>
K>def flatMap[B](f: A => Option[B]): Option[B] =
K> if (isEmpty) None else f(this.get)
K>
Определение flatMap вполне как у хаскеля:
instance Monad Maybe where
(Just x) >>= k = k x
Nothing >>= _ = Nothing
instance MonadPlus Maybe where
mzero = Nothing
Nothing `mplus` ys = ys
xs `mplus` _ys = xs
None (Nothing) это и есть mzero для Option (Maybe). Вместо mplus Scala использует filter, компилятор дописывает в паттерн "case _ => false".
Другими словами
def foo[A](xs:List[Option[A]]) = for { Some(x) <- xs } yield x
превращается в (упрощенно):
def foo[A](xs:List[Option[A]]) = xs.filter( (x) => x match {
case Some(_) => true
case _ => false
}).map( (y) => y match {
case Some(z) => z
})