• Монада Maybe на стероидах

      Про монады на Хабре было уже столько много публикаций, что, мне кажется, не хватает еще одной.

      Я не буду расписывать, что такое монада, я просто покажу одну забавную реализацию монады Maybe (мы же в хабе «Ненормальное программирование»?).
      Читать дальше →
    • Аппликация Expressions

        Добрый день.

        Просматривая недавно чужой код, наткнулся на довольно интересную задачу о IQueryable и Expession trees. Надеюсь, решение будет кому-нибудь полезно.

        Задача заключается в том, чтобы повторно использовать некоторый Expression внутри другого Expression, например, у нас есть некий f:

        Expression<Func<int, int, int>> f = (a, b) => a + b;
        


        И мы бы хотели использовать этот f внтури другого expression, например так:

        Expression<Func<int, int, int, int>> g = (a, b, c) => f(a+b,b)*c;
        


        Причем необходимо, чтобы результирующий expression был «чистым», т.е. пригодным для использования внутри IQueryable (без скомпилированных функций и т.п.)

        Решение
      • Еще одна причина, почему структуры — это плохо

          Столкнулся на работе с интересной точкой зрения. В проекте все мало-мальские data transfer objects сделаны структурами. На вопрос, зачем так было сделано, получил ответ, что таким образом данные защищаются от изменений. С одной стороны, да, звучит, в принципе, логично, любые методы получают только копию и не в силах ничего подменить.
          Но с другой стороны...
        • Экология программирования

            Речь не пойдет о пользе для лесов Бразилии перехода на электронный документооборот или выключении Num lock для экономии электроэнергии. Я хочу поговорить об «экологии» как более широком (или же наоборот, более специализированном) понятии, как взаимодействии разработчика со средой разработки в широком смысле этого слова.
            Читать дальше →
          • Школьная задачка по физике

              Привет,

              Предлагаю на ваш суд следующую задачку на школьный курс физики.

              На весы поместили сосуд с водой, в воду положили деревянный брусок. Брусок плавает на поверхности. Уровень воды в сосуде, естествено, поднялся. После брусок вынули и в сосуд долили воды до уровня, который был в сосуде вместе с бруском. В каком случае весы покажут больший вес — с плавающим бруском или с долитой водой?
              Читать дальше →
            • Expressions в C# — impress yourself!

                .NET 4.0 уже не за горами и принесет кучу всего нового, нужного и не очень, крутого и суперкрутого. Однако и в старом добром .NET 3.5 есть много разных интересных фич, которые не используются в повседенвной работе, но иногда здорово облегчают жизнь разработчикам. Одна из таких замечательных штук — это Expressions.
                Много текста и кода
              • Трехсторонняя монетка

                  Предположим, у нас есть три варината, среди которых мы хотим выбрать один случайным образом. Еще у нас есть монетка. Как с помощью подбрасывания монетки выбрать один вариант из трех случайным образом с одинаковой вероятностью? Каково мат.ожидание количество подбрасывания монеток? Сколько раз придется бросить монетку в худшем случае?
                • Открыть сейф

                    Привет.

                    Хочу рассказать вам об одной задаче, которая занимает меня уже очень продолжительное время. Сразу хочу сказать, что я не знаю ее решения (чтобы не превращать топик в очередной топик зла). Также я не встречал задач, подобной этой, в интернете, хотя вполне допускаю, что первый же коммент будет со ссылкой на решение.

                    Читать дальше →
                  • Метапрограммирование в C++

                      Метапрограммирование — это «программирование программ», то есть написание некой промежуточной программы, результатом которой будет некая часть другой программы. Самый просто пример метапрограммирования — это шаблоны C++. Вместо написания десяти одинаковых функций для разных типов, мы пишем шаблон, и компилятор сам соберет нам эти десять функций.
                      Читать дальше →
                    • Анонимные типы за пределами функции

                        Анонимные типы — очень приятное расширение C#, появившееся в версии 3.0. С помощью анонимных типов мы можем налету создать объект-хранилище и наполнить его данными.
                        Основное применение анонимных типов — это, конечно, LINQ. Фактически, они и были созданы для него (вообще говоря, все нововведения C# 3.0 были сделаны для LINQ, за исключением, пожалуй, частичных методов).
                        var o = new {Bar=2, Foo="string"};

                        Читать дальше →
                      • Замыкания в C#

                          Перед прочтением статьи, ответьте на следующий вопрос — что будет напечатано, после исполнения следующего кода?

                          P p = Console.WriteLine; // P объявлен как delegate void P();
                          foreach (var i in new [] { 1, 2, 3, 4 }) {
                            p += () => Console.Write(i);
                          }
                          p();
                          Элементарно?