Монады на Скале
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.06.10 12:23
Оценка:
Собственно сабжевая презентация от Melbourne Scala User Group
via ivan_ghandhi

P. S. ждём монады на немерле?
Re: Монады на Скале
От: WolfHound  
Дата: 13.06.10 18:18
Оценка:
Здравствуйте, Курилка, Вы писали:

К>P. S. ждём монады на немерле?

Зачем?
У нас уже есть ComputationExpressions
Вот пример того что с этим можно делать Async в действии
Автор: WolfHound
Дата: 20.05.10
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Монады на Скале
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.06.10 18:53
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Курилка, Вы писали:


К>>P. S. ждём монады на немерле?

WH>Зачем?
WH>У нас уже есть ComputationExpressions
WH>Вот пример того что с этим можно делать Async в действии
Автор: WolfHound
Дата: 20.05.10


Ты не понял, речь про презентацию, где было бы разжёвано, что такое монады и как они в немерле реализуются. Частные примеры это, конечно, полезно, но речь о монаде как единой абстракции.
Re[3]: Монады на Скале
От: WolfHound  
Дата: 13.06.10 19:06
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Ты не понял, речь про презентацию, где было бы разжёвано, что такое монады и как они в немерле реализуются. Частные примеры это, конечно, полезно, но речь о монаде как единой абстракции.

Это ты не понял.
ComputationExpressions строгое надмножество того что есть в скале.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Монады на Скале
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.06.10 19:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Курилка, Вы писали:


К>>Ты не понял, речь про презентацию, где было бы разжёвано, что такое монады и как они в немерле реализуются. Частные примеры это, конечно, полезно, но речь о монаде как единой абстракции.

WH>Это ты не понял.
WH>ComputationExpressions строгое надмножество того что есть в скале.

Т.е. твоё заявление равнозначно по доступности презентации приведённой выше?
Ну и монады не есть множества, как минимум, и твоё определение отношения "над" для математических абстракций тоже было бы интересно увидеть.
Re[5]: Монады на Скале
От: WolfHound  
Дата: 13.06.10 20:32
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Т.е. твоё заявление равнозначно по доступности презентации приведённой выше?

Мой пример по крайней мере практичный в отличии от заумных выкрутасов в той презентации.
Пойми одну простую вещь: Люди которые не знакомы с монадами посмотрят на эту презентацию и подумают что это все из пальца высасано.
А вот превращение асинхронных оперций в последовательный код уже намного интересней.

К>Ну и монады не есть множества, как минимум, и твоё определение отношения "над" для математических абстракций тоже было бы интересно увидеть.

В скале есть только две опрации bind и return (в скале его unit обозвали)
ComputationExpressions содержат еще много других полезных операций.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Монады на Скале
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.06.10 21:10
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Курилка, Вы писали:


К>>Т.е. твоё заявление равнозначно по доступности презентации приведённой выше?

WH>Мой пример по крайней мере практичный в отличии от заумных выкрутасов в той презентации.
WH>Пойми одну простую вещь: Люди которые не знакомы с монадами посмотрят на эту презентацию и подумают что это все из пальца высасано.
WH>А вот превращение асинхронных оперций в последовательный код уже намного интересней.

Т.е. получаем, что ты меня всёж не понял
Презентация-то как раз для людей не знакомых с монадами (хотя это уже замучаная тема).
Я не спорю, что практичные примеры вещь нужная и очень полезная.
Только вот есть заметная разница между (возможно красивым) частным примером и описание абстракции, которая обнаруживается в достаточно большом числе (в том числи и очень практических) случаев.
Но, возможно, это слишком высокий уровень абстракции и для большинства является заумью.
Re[7]: Монады на Скале
От: WolfHound  
Дата: 13.06.10 21:37
Оценка: +2 :)
Здравствуйте, Курилка, Вы писали:

К>Т.е. получаем, что ты меня всёж не понял

К>Презентация-то как раз для людей не знакомых с монадами (хотя это уже замучаная тема).
Нет. Эта презентация не понятно для кого.
Люди знающие монады ничего нового не узнают.
Люди не знающие сочтут монады не понятной хренью для вымученых синтетических примеров.

К>Я не спорю, что практичные примеры вещь нужная и очень полезная.

Это единственный способ заинтересовать человека.
Можно сколько угодно приводить синтетических примеров но все бестолку.
Это всеравно как объяснять крутизну функционального пограммирования на примере факториала.

К>Только вот есть заметная разница между (возможно красивым) частным примером и описание абстракции, которая обнаруживается в достаточно большом числе (в том числи и очень практических) случаев.

К>Но, возможно, это слишком высокий уровень абстракции и для большинства является заумью.
Это не уровень абстракции слишком высокий, а примеры не адекватные.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Монады на Скале
От: dsorokin Россия  
Дата: 14.06.10 10:21
Оценка: 1 (1)
Здравствуйте, Курилка, Вы писали:

К>P. S. ждём монады на немерле?


Как уже ответили, в Немерле есть computation expressions. Это синтаксический сахар для монад и моноидов. Примерно как в f#. Это выглядит даже круче, чем for-comprehension в Cкале. Вот, презентации или документации, к сожалению нет. Зато есть обобщенный макрос comp, которому все равно какая монада или моноид. С монадными трансформерами сложнее, но с ними в f# и Cкале непросто.
Re[5]: Монады на Скале
От: Klapaucius  
Дата: 15.06.10 06:11
Оценка:
Здравствуйте, Курилка, Вы писали:

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
Re[7]: Монады на Скале
От: Klapaucius  
Дата: 15.06.10 06:16
Оценка: 5 (1)
Здравствуйте, Курилка, Вы писали:

К>Презентация-то как раз для людей не знакомых с монадами (хотя это уже замучаная тема).


Мне кажется, что для рядового индустриального девелопера, на которого Скала, вроде как, ориентирована презентация какая-то перегруженная. Даже это получше, не смотря на всякие хиханьки и хаханьки.
А продвинутый может нормальную статью прочитать.
... << 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
Re[2]: Монады на Скале
От: Klapaucius  
Дата: 15.06.10 06:44
Оценка: 2 (2) +1
Проблема в том, что в дотнетных дженериках интерфейс монады не выражается.
Т.е. нельзя записать функцию, которая работает с любой монадой — для этого нужен полиморфизм более высокого ранга.
Допустим, нам нужна функция, которая поднимает бинарную операцию в монаду. Т.е. если мы поднимаем в мэйби — у нас будет вычисление, которое равно результату бинарной опирации если оба аргумента 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);
}

Это невозможно — абстрагироваться от конструктора типа дотнетные дженерики не позволяют — только от типа.
Ну а в Скале интерфейс монады записать можно:
trait Monad[M[_]] {
  def return[A](a: A): M[A]
  def bind[A, B](a: M[A], f: A => M[B]): M[B]
}
... << 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
Re[8]: Монады на Скале
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.06.10 07:51
Оценка: 6 (1)
Здравствуйте, Klapaucius, Вы писали:

Даже это получше, не смотря на всякие хиханьки и хаханьки.

Есть версия 1.1
Re[6]: Монады на Скале
От: z00n  
Дата: 15.06.10 08:18
Оценка:
Здравствуйте, 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)
Re[7]: Монады на Скале
От: Klapaucius  
Дата: 15.06.10 10:03
Оценка:
Здравствуйте, z00n, Вы писали:

scala>> for (Some(x) <- Some(1)::None::Some(2)::Nil) yield x
res0: List[Int] = List(1, 2)


А во что это рассахаривается?
... << 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
Re[8]: Монады на Скале
От: z00n  
Дата: 15.06.10 10:56
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, z00n, Вы писали:


K>
scala>>> for (Some(x) <- Some(1)::None::Some(2)::Nil) yield x
K>res0: List[Int] = List(1, 2)
K>


K>А во что это рассахаривается?


В вызовы filter, map, foreach и flatMap. flatMap это в точности bind.

Подробно правила можно посмотреть The Scala Language Specification стр 83-85
Re: Монады на Скале
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 15.06.10 19:17
Оценка: :))
Здравствуйте, Курилка, Вы писали:
[offtopic]
После тяжелого рабочего дня читаю название темы: "Монады на скАле".
Подумал что теорию категорий придумали раньше чем письменность...
[/offtopic]
Re[2]: Монады на Скале
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.06.10 19:40
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Курилка, Вы писали:

G>[offtopic]
G>После тяжелого рабочего дня читаю название темы: "Монады на скАле".
G>Подумал что теорию категорий придумали раньше чем письменность...
G>[/offtopic]

Во времена наскальной живописи, не иначе...
Re[9]: Монады на Скале
От: Klapaucius  
Дата: 16.06.10 11:11
Оценка:
Здравствуйте, 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
Re[10]: Монады на Скале
От: z00n  
Дата: 16.06.10 13:56
Оценка:
Здравствуйте, 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
})
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.