Здравствуйте, deniok, Вы писали:
D>Здравствуйте, _NN_, Вы писали:
_NN>>Подскажите хорошую и относительно простую презентацию/слайды с объяснением монад.
D>здесь
D>перевод
С этим знаком, спасибо.
Надо видимо просто сделать из этого презентацию.
Здравствуйте, _NN_, Вы писали:
F>>а есть ли объяснение монад не через хаксель? _NN>Можете поискать для Scala. Библиотека Scalaz. _NN>Можно почитать блог: http://bartoszmilewski.com/category/monads/ , тут сравнивается с С++.
ага, вот это не видел. спасибо.
остальное читал и как-то не то. через код понимается лучше, чем в пространных рассуждениях.
Здравствуйте, neFormal, Вы писали:
F>а есть ли объяснение монад не через хаксель?
Можно взглянуть на асинхронные вычисления в F#. В учебниках по этому языку, как правило, нигде не упоминается страшное слово "монада", но тип Async<'T> именно монадой и является. Более того, есть хороший синтаксический сахарок для него, причем обобщенный, который можно применять и для других монад, в том числе, своих собственных. По моим наблюдениям усваивается материал относительно просто.
Там фишка в том, что к монадическому сахару подводят постепенно через последовательности, а о них многие уже знают по C# и ключевой конструкции yield return. Опять же, в питоне есть генераторы. Так вот, в F# есть свой собственный синтаксический сахар, который работает одновременно и для последовательностей, и для монад. Без удобного в использовании синтаксического сахара нет особого практического смысла в монадах на мой частный взгляд.
Обычно человек сначала учиться использовать последовательности и асинхронные вычисления. Если опыт оказывается успешным, то есть все шансы научиться создавать и собственные монады в F#.
Такой путь к пониманию монад через первоначальное привыкание к сахару не является особенным. Если брать книгу Real World Haskell, то там тоже сначала учат тому, как использованию нотацию do, и лишь много позже подводят к самим монадам.
P.S. А, вообще, я воспринимаю монады как один из видов вычислений. Вычисление оборачивает то, что вычисляет, и поэтому параметрический тип M<'a>. Вычисления можно создавать из примитивов, и поэтому функция return. Вычисление можно связывать с его продолжением, и поэтому функция bind.
Здравствуйте, dsorokin, Вы писали:
D>Там фишка в том, что к монадическому сахару подводят постепенно через последовательности, а о них многие уже знают по C# и ключевой конструкции yield return. Опять же, в питоне есть генераторы.
да, интересная мысль. список ф-ций, как сгенеренная в рантайме монада. только сахару не хватает.
D>Если брать книгу Real World Haskell, то там тоже сначала учат тому, как использованию нотацию do, и лишь много позже подводят к самим монадам.
а если взять learnyou, то там наоборот. сначала аппликативные ф-торы, потом уже монады.
и ведь не мешает.
Здравствуйте, neFormal, Вы писали:
D>>Там фишка в том, что к монадическому сахару подводят постепенно через последовательности, а о них многие уже знают по C# и ключевой конструкции yield return. Опять же, в питоне есть генераторы.
F>да, интересная мысль. список ф-ций, как сгенеренная в рантайме монада. только сахару не хватает.
Получается, — кому что ближе.
Можно заезжать в монады через хорошо изученную Set или List — соответственно, через list comprehension и всё такое.
А можно через продолжения.
D>>Если брать книгу Real World Haskell, то там тоже сначала учат тому, как использованию нотацию do, и лишь много позже подводят к самим монадам.
F>а если взять learnyou, то там наоборот. сначала аппликативные ф-торы, потом уже монады. F>и ведь не мешает.
Так открывается красота математического базиса.
И хорошо увязываются все нотации.