Showing posts with label Lambda. Show all posts
Showing posts with label Lambda. Show all posts

Tuesday, June 29, 2010

Анонимная рекурсия на C# и лямбды

Лямбды есть анонимные функции, а рекурсия требует определения имен.
Определение функции, которая вычисляет число Фибоначчи:

Func fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;

Но работать это не будет, т.к. компилятор выдаст ошибку:
Use of unassigned local variable 'fib'

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

Быстрый обход этой проблемы - присвоить fib null, то есть явно определить fib перед тем, как она будет использована.

Func fib = null;
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Console.WriteLine(fib(6));                        // displays 8

Но это решение не является настоящей рекурсией. Рекурсия требует, чтобы функция вызывала саму себя. В данном случае функция fib просто вызывает делегат, на который ссылается локальная переменная fib. На первый вгзгляд, это игра слов, но рассмотрим следующий пример:

Func fib = null;
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Func fibCopy = fib;
Console.WriteLine(fib(6));                        // displays 8
Console.WriteLine(fibCopy(6));                    // displays 8
fib = n => n * 2;
Console.WriteLine(fib(6));                        // displays 12
Console.WriteLine(fibCopy(6));                    // displays 18

Можно заметить, как меняется результат вызова fib и даже вызов fibCopy отличается от вызова fib. Этот беспредел можно остановить, передавая функцию, которая будет использоваться для рекурсивного вызова:

(f, n) => n > 1 ? f(f,n - 1) + f(f,n - 2) : n

Таким образом, лямбда выглядит почти так же за тем исключением, что она первым параметром принимает функцию f. Когда вызывается фунцкия f, нужно передать ее в себя первым аргументом.

Чтобы это реализовать и преобразовать лямбду к делегату, необходимо определить тип делегата. Начнем с типа fib, Func. Возвращаемый тип - int, принимаемым вторым аргументов типом также должен быть int. Что касается первого аргумента, им должен быть делегат, который должен вызываться с теми же аргументами, которые мы определяем в данном случае, что и есть рекурсия:

delegate int Recursive(Recursive r, int n);

Этот делегат можно обобщить через параметризацию аргумента и возвращаемого типа:

delegate R Recursive(Recursive r, A a);

Теперь можно использовать лямбду, определенную выше:

Recursive fib = (f, n) => n > 1 ? f(f,n - 1) + f(f,n - 2) : n;
Console.WriteLine(fib(fib,6));                      // displays 8
Хотя это является решением, выглядит оно не так красиво, как первоначальный код...

(продолжение следует)

Friday, June 4, 2010

Y Combinator

Thursday, May 28, 2009

Lambda resources

Lambda Calculus and Lambda Calculators (implementation)


Type system
The Lambda-calculus, Combinatory Logic, and Type Systems

Комбинаторы - это просто!

Практика функционального программирования
Выпуск 1, 2009
http://www.scribd.com/doc/44147436/Functional-Programming-Russian

Lambda in short
From: http://thesz.livejournal.com
Коротко и неформально. Лямбда-исчисление - это правила построения и вычисления безымянных функций. И перейдем сразу к примерам.

Friday, April 24, 2009

What is next

Tasks:
  • Python development
  • Ruby on Rails architecture and development
  • Experience working with Standard Rails stack tools
  • Experience working with jQuery or other Open Source Javascript
  • Experience in a fast-paced, Agile environment
  • NoSQL and MapReduce (e.g. MongoDb, Riak) preferred
  • Experience/Knowledge of Continuous Integration, Behavior Driven Development, and Test Driven Development preferred
  • HAML/SASS experience ideal
  • CoffeeScript experience ideal
Developers & MVP:
http://www.codethinked.com

.NET languages:
http://nesteruk.wordpress.com/2010/08/02/dot-net-polyglot-programming
http://roinet.net/2010/08/12/nuzhen-li-python-v-net-steke

F#, Closure, Nemerle

Memcached:
http://habrahabr.ru/tag/memcached
Memcached, заставим работать

Haskell Web Framework:
http://www.yesodweb.com
http://www.yesodweb.com/five-minutes

Фильтры Калмана
Wiki
http://rriai.org.ru/filtryi-kalmana-2.html
roboforum
http://www.sernam.ru/r_25.php
Васильев: Методы обработки сигналов
http://adrianboeing.blogspot.com/2010/05/kalman-filters.html

Source code/libraries:
http://kalman.sourceforge.net
http://bayesclasses.sourceforge.net
http://www.memsense.com/index.php/Product-Pages/kalman-filter-library.html
http://sites.google.com/site/jordiuavs/Home/kalman_filter_by_Jordi.txt
http://www.orocos.org/bfl
http://www.scipy.org/Cookbook/KalmanFiltering

Статьи от Alex Ott
http://alexott.net/ru/index.html
    Статьи по функциональному программированию
    http://erlanger.ru/page/1571/erlando-monady-dlya-erlang-a
    http://nesteruk.wordpress.com/2011/02/05/are-fsharp-equations-easier-than-csharp/
    http://klyuchnikov.blogspot.com/2011/05/scala-in-action.html

    LLVM
    http://en.wikipedia.org/wiki/Low_Level_Virtual_Machine
    http://tutorialsblogs.com/llvm-tutorial-getting-started
    http://zathras.de/angelweb/blog-llvm-tutorial-link.htm
    http://www.mdevan.org/llvm-py/examples.html
    http://llvm.org/releases/2.6/docs/tutorial/JITTutorial1.html
    http://llvm.org/docs/tutorial/
    http://ru.wikipedia.org/wiki/Low_Level_Virtual_Machine

    CMS
    Erlang: http://zotonic.com

    Objective-C



    Powered by Blogger.