Здравствуйте, AlexRK, Вы писали:
ARK>Хм, но это же ад. Первый вариант — самый понятный.
Понятность — очень субъективный параметр. Зависит от исключительно от предыдущего опыта писания.
ARK>Да и зачем монада тут?
Это же пример. В языке C#, кроме списков, монады практически не нужны.
ARK>Разве нельзя сделать примерно так (предположим, что в С# есть интерфейсы для чисел и классы типов)
Во-первых в C# таки нет классов типов, и не предвидится в ближайшее время.
Во вторых, запишем выражение по другому:
from v1 in a
from v2 in f(v1)
select g(v1, v2)
И никакие переопределения операторов не помогут разрулить.
ARK>Ну и самое главное — на этом примере уменьшения количества писанины не видно...
Странно что не видно...
Если ты не заметил, то для "ручного" варианта надо в каждом методе, оперирующим Maybe<T> проверять что есть значение (копипастить код).
Монады, как и другие паттерны, позволяют количество копипасты уменьшить и о паксимуму перенести в повторно используемые библиотеки.