LINUX.ORG.RU

Ответ на: комментарий от Virtuos86

For example, given

shared_ptr<a> foo();
shared_ptr<b> bar(a);
We can simply write
shared_ptr<b> ptr = foo() >>= bar;
Instead of
shared_ptr<b> ptr(nullptr);
auto ptra = foo();
if(ptra) {
    ptr = bar(*ptra);
}

hateyoufeel ★★★★★
()

std::cout << "Hello, world" << std::endl; — монада. Плохо что до Страуструпа не доперло, что при перегрузке операторов можно/нужно указывать ассоциативность и приоритет, и что можно вообще было выпендриться и запилить миксфиксную форму как в Агде (тогда можно было бы перегужать операторы if и for).

foo.bar().baz() — тоже монада. Такие конструкции лепят где попало. Увы, ни в одном языке где их лепят нельзя перегужать оператор . и писать полноценные монады.

Для комфортного использования монад в языке должна быть поддержка комбинаторного стиля программирования, и do-нотации. Иначе, ничего серьёзнее однострочников в монадическом стиле не написать.

Macil ★★★★★
()
Ответ на: комментарий от Macil

std::cout << «Hello, world» << std::endl; — монада.

Нет: монада в терминах С++ - это шаблонный конструктор с сахарком.

anonymous
()

А зачем они вне хаскеля? Хаскель - среда, где абстакции в виде монад удобны. Но за его пределами где это удобно использовать? Разве что в лисп макросами вкрутить monad-do синтаксис.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Хаскель - среда, где абстакции в виде монад удобны. Но за его пределами где это удобно использовать?

Везде удобно, где есть необходимость и минимальная поддержка со стороны синтаксиса.

ovk48 ★★★
()
Ответ на: комментарий от A1

Все это прекрасно, только пустой указатель скорее всего означает ошибку, а она проглатывается.

Вот именно, что не проглатывается, а исполнение прервется в нужном месте (читать про монаду Maybe)

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

если говорить о Maybe, то уж тогда лучше не прикручивать похожее поведение указателям, а юзать std::experimental::optional

почему юзать экспериментал? потому что он выйдет из экспериментала явно не раньше, чем в с++ какой-нибудь хипстор решит запилить нормальные монады

f1u77y ★★★★
()

Да, в Purescript и Scala.

anonymous
()

Вам когда то приходилось реализовывать монады не на haskell?

Сначала тебе нужно понять, что такое монады и зачем они нужны=)

По сабжу: делал для себя на знакомых языках, просто для того, чтобы понять, как это работает.

anonymous
()
Ответ на: комментарий от Macil

Увы, ни в одном языке где их лепят нельзя перегужать оператор . и писать полноценные монады.

В плюсах, вероятно, это будет возможно.

DarkEld3r ★★★★★
()

Да, на F#. Там есть computation expressions, что делает использование монад на F# таким же простым и удобным как и на Haskell. Более того, совсем необязательно понимать, как устроена монада, чтобы ее успешно использовать.

dave ★★★★★
()
Ответ на: комментарий от yoghurt

В данном конкретном примере проглатывается.

A1
()
Ответ на: комментарий от cdshines

Я не против монад. Конкретно данный пример попахивает.

A1
()
Ответ на: комментарий от dave

потому что это и есть костыль. Костыль этот идет оттого, что в других ЯП есть явные контексты. Следствием этого является то, что простейшее foo.bar.baz в хаскеле пишется через глубочайшую жопу. Причем те кто пишет эти монды, даже не понимают что это такое, что особенно забавно. Это бурито, это карлик со страпоном, это контейнер, это волшебство, это кококо, lol. Зато каждый имеет собственное_мнение по этому поводу.

anonymous
()
Ответ на: комментарий от Macil

Агде (тогда можно было бы перегужать операторы if и for).

А Вы в курсе, что во многих языках if и for являются не тем говном, которым они являются в агде, а функциями, и полноценными ООП-объектами(как и любая другая функция — частный случай объекта) и с ними вообще можно делать все что угодно? Перегружать, переименовывать, модифицировать, удалять...

anonymous
()
Ответ на: комментарий от Macil

Увы, ни в одном языке где их лепят нельзя перегужать оператор .

Чаще всего, видимо, препроцессор разворачивает foo.bar(arg) во что-то типа call(foo, bar, arg). И что Вам даст перегрузка? Допустим это возможно, только зачем? Покажите пример, где это могло бы быть полезно.

anonymous
()
Ответ на: комментарий от beastie

Сомнительно. В подавляющем большинстве языков банальный mapM написать не выйдет, для чего в них «монады» используются?

(За ссылки на Крокфорда вообще стыдно должно быть. Он совсем ничего в этом не понимает.)

anonymous
()
Ответ на: комментарий от anonymous

И что Вам даст перегрузка?

Возможность *не* выполнять call, если значение foo мне «не нравится». В контексте foo.bar() это немножко бессмысленно, но в контексте foo.bar().baz().quux() очень даже востребовано.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Возможность *не* выполнять call, если значение foo мне «не нравится»

Это же ад с точки зрения проектирования. Ты смотришь на код и не знаешь что он делает. Максимум на еще можно пойти это явный оператор "?.". То есть вызывающая сторона контролирует отброс плохого значения.

A1
()
Ответ на: комментарий от A1

Это же ад с точки зрения проектирования. Ты смотришь на код и не знаешь что он делает.

Так для хаскелистов это считается нормой. У них 90% кода настолько абстрактны, что могут делать абсолютно все что угодно. По-этому какой-либо ризонинг вообще нереален, про функцию даже обычно нельзя сказать корректна она или нет - потому что ее корректность полностью зависит от call-site.

anonymous
()
Ответ на: комментарий от anonymous

Где это такие абстрактные хаскелисты обитают? У меня 90% кода - агрессивный пердолинг в IO-монадке, не думаю, что у кого-то сильно иначе.

anonymous
()
Ответ на: комментарий от Macil

но в контексте foo.bar().baz().quux() очень даже востребовано.

Зачем? По-моему это плохая идея. Разве что в случае ошибки, но ведь исключения итак сделают то, что нужно.

anonymous
()
Ответ на: комментарий от Macil

Возможность *не* выполнять call, если значение foo мне «не нравится»

А, вон оно что. Ну держи возможность, LOL

foo := Object clone do(
   bar := Object clone do(
     baz := 1
   )
)

moo := nil

doIfExists := method(
  doString( 
   call message arguments at(0) asString asMutable replaceSeq(" ", "?") 
  )
)

doIfExists(

  foo bar baz println // 1
  moo bar baz println // nil

) 

anonymous
()
Ответ на: комментарий от anonymous

По-моему это плохая идея.

По-моему — тоже. Но ТС спрашивал про монадический стиль не на хаскеле. Вот это, собственно, и он.

Не всегда уместно пользоваться исключениями. Например, при создании монадического парсера с бэктрэкингом.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Вот это, собственно, и он.

то есть это банальный чейнинг? foo.bar.baz? Это монадический стиль? То есть, ООП — это сплошь и рядом монады? А в хаскеле это костыль имитирующий поведение объектов? Так ведь раньше говорили, что монады — это буритто и анчеладос, и простому быдлу не понять. Зачем же вы разочаровываете адептов?&toBuffer=to buffer

anonymous
()
Ответ на: комментарий от anonymous

Лизны - это пугало в рамках avoid success at all costs, в реальном мире ими никто не пользуется.

anonymous
()
Ответ на: комментарий от Macil

Все из монад, даже небо, даже Аллах.

anonymous
()
Ответ на: комментарий от pineapple

Для монад еще return нужен, через fmap/join он не выражается. И вот его-то на генериках не сделать, потому в вышеприведенной реализации сделано на параметрах.

anonymous
()
Ответ на: комментарий от anonymous

в вышеприведенной реализации сделано на параметрах.

Это которая на крестах или на шарпе?

pineapple
()
Ответ на: комментарий от anonymous

А, ты про better-monads, да, видел такую библиотеку.

anonymous
()
Ответ на: комментарий от Macil

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

Gorthauer ★★★★★
()
Ответ на: комментарий от Macil

Плохо что до Страуструпа не доперло, что при перегрузке операторов можно/нужно указывать ассоциативность и приоритет

До него доперло, что некоторые этого захотят. Но он решил, что на этих некоторых проще забить .

tailgunner ★★★★★
()
Ответ на: комментарий от Gorthauer

Можно на раз два три монады делать.

Момент истины наступает, когда кто-нибудь пытается реализовать монаду Cont. Тогда и можно будет говорить.

dave ★★★★★
()
Ответ на: комментарий от anonymous

мне просто надоело, и я не считаю для себя пребывание здесь полезным более

ага, счас

jtootf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.