Пример #1
0
        private Maybe <BowlOf <EggsMixture> > MakeEggsMixture()
        {
            /*
             *  Выглядит чуть лучше и писать несколько удобнее.
             *  Если бы было ветвление логики, то пришлось бы разбивать на куски и миксовать с вызовом методов-аналогов
             *  Select/SelectOrElse/Do/DoOrElse из первой части задания.
             *
             *  Основной же минус - мы работаем с IEnumerable и на выходе тоже IEnumerable, что как бы не очень:
             *      - нарушается семантика кода. Мы должны работать в терминах монады Maybe, а не последовательностей
             *      - кое-что еще. Что? Подсказка: проблема в работе с объектами как объектами некоторого интерфейса
             */
            var result =
                from pumpkinPieFilling in _cookingTable.FindCansOf <PumpkingPieFilling>(1m).ToMaybe()
                from sugar in _cookingTable.FindCupsOf <WhiteSugar>(3m).ToMaybe()
                from oil in _cookingTable.FindCupsOf <VegetableOil>(0.5m).ToMaybe()
                from water in _cookingTable.FindCupsOf <Water>(0.5m).ToMaybe()
                from eggs in _cookingTable.FindSome <Egg>(4m).ToMaybe()
                from eggsMixture in _cookingTable.FindBowlAndFillItWith(new EggsMixture()).ToMaybe()
                select eggsMixture;

            // !!!: result имеет тип IEnumerable<BowlOf<EggsMixture>>

            // нужно явно вернуться из IEnumerable в Maybe - для этого и нужен соответствующий экстеншн.
            return(result.ToMaybe());
        }
Пример #2
0
 private Maybe <BowlOf <EggsMixture> > MakeEggsMixture()
 {
     // как видишь, так можно, но чет не очень удобно - получается огромная вложенная блямба селектов
     // и это у нас еще логика не ветвистая!
     return(_cookingTable.FindCansOf <PumpkingPieFilling>(1m).ToMaybe()
            .Select(pumpkinPieFilling => _cookingTable.FindCupsOf <WhiteSugar>(3m).ToMaybe()
                    .Select(sugar => _cookingTable.FindCupsOf <VegetableOil>(0.5m).ToMaybe()
                            .Select(oil => _cookingTable.FindCupsOf <Water>(0.5m).ToMaybe()
                                    .Select(water => _cookingTable.FindSome <Egg>(4m).ToMaybe()
                                            .Select(eggs => _cookingTable.FindBowlAndFillItWith(new EggsMixture()).ToMaybe()
                                                    ))))));
 }
Пример #3
0
 private Maybe <BowlOf <EggsMixture> > MakeEggsMixture()
 {
     /*
      *  Теперь мы оперируем только объектами типа Maybe<T> -
      *  больше никаких непонятных преобразований в IEnumerable и обратно :)
      */
     return
         (from pumpkinPieFilling in _cookingTable.FindCansOf <PumpkingPieFilling>(1m).ToMaybe()
          from sugar in _cookingTable.FindCupsOf <WhiteSugar>(3m).ToMaybe()
          from oil in _cookingTable.FindCupsOf <VegetableOil>(0.5m).ToMaybe()
          from water in _cookingTable.FindCupsOf <Water>(0.5m).ToMaybe()
          from eggs in _cookingTable.FindSome <Egg>(4m).ToMaybe()
          from eggsMixture in _cookingTable.FindBowlAndFillItWith(new EggsMixture()).ToMaybe()
          select eggsMixture);
 }