• Одно из возможных применений Y-комбинатора

      Идея. А давайте отправим Ы-комбинатору на вход… не сам Ы-комбинатор, но почти Ы. Ы-штрих, даже не комбинатор, а просто функцию, не имеющую выхода из реккурсии.

      Я знаю, что бы 100 раз так делали, и ничего хорошего, кроме STACK_OVERFLOW_EXCEPTION не выходило.

      Пусть она принимает на вход состояние, вводит и выводит информацию, и отправляет состояние дальше.
      Y functor data = functor (\newdata -> Y functor newdata) data
      
      Yscratch callback state =
          // пересечь знания со входными данными
          let new-state = intersect state (input()) in
              output state
              // упростить знания, если возможно
              callback (reduce state);
      

      а теперь
      wtf iIdiot =
          Y Yscratch iIdiot;
      

      Что это за нафиг? Это имитация сознания. Если state представляет из себя аналог нейронной сети, то прямая имитация.

      Вот только, кому это надо?
    • F# не ленится :(

        Вот код:

        let rec Y func tracker args =
            func args (Y func tracker (tracker args))
            
        let fib N = (fun (x, y) -> x) (Y 
            (fun N (prev, pprev) -> if N = 1 then (1, 0) else (prev + pprev, prev)) 
            (fun N -> N - 1)
            N)
                
        let main =
            let value = fib 10
            System.Console.WriteLine(value)
            System.Console.ReadKey()
        

        При компиляции и запуске он, вместо того, чтобы полностью рассчитать первую лямбда-функцию с N = 0 на кой-то черт рассчитывает никому не нужные значения N, меньшие нуля!

        Что происходит? Может быть, «ленивость» можно как-то форсировать?
      • Y-комбинатор, упрощение интерфейса

          Итак, все мы помним, что такое Y-комбинатор (кто не помнит, это комбинатор неподвижной точки или Y g = g Y g). Из математической его записи следует некоторая проблема: он генерирует последовательность g g g… g Y g, в которой каждый следующий шаг может использовать лишь результат предыдущего вычисления да захваченный из комбинатора кусок контекста — что приводит к необходимости для каждой функции писать свой собственный комбинатор.

          Идея заключается в том, чтобы написать Y-комбинатор, который не будет зависеть от самоприменяемой функции.

          Читать дальше →
        • Функциональное программирование :: реккурсивные функции

            Итак, решил я писать компилятор/интерпретатор функционального языка. По началу сделал в виде вычисляющего дерева Черча, где каждая команда-нейрон представляла из себя отдельный объект, к которому прицеплены параметры. При вызове функции get() выполнялось обращение к необходимым входным данным. Я даже соорудил некое подобие strchr, и оно даже работало.
            Читать дальше →