Showing posts with label Lambda. Show all posts
Showing posts with label Lambda. Show all posts
Friday, March 4, 2011
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 = 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 = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Func
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
Console.WriteLine(fib(fib,6)); // displays 8
Хотя это является решением, выглядит оно не так красиво, как первоначальный код...
(продолжение следует)
Friday, June 4, 2010
Y Combinator
Для начала, список ссылок, по которым можно ознакомиться с материалом:
http://mvanier.livejournal.com/2700.html
http://www.paulbatum.com/2009/01/refactoring-towards-y-combinator-part-1.html
http://blogs.msdn.com/madst/archive/2007/05/11/recursive-lambda-expressions.aspx
http://www.dreamsongs.com/Files/WhyOfY.pdf
http://mvanier.livejournal.com/2700.html
http://www.paulbatum.com/2009/01/refactoring-towards-y-combinator-part-1.html
http://blogs.msdn.com/madst/archive/2007/05/11/recursive-lambda-expressions.aspx
http://www.dreamsongs.com/Files/WhyOfY.pdf
Wednesday, June 2, 2010
Pure functional data structures
http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf
http://www.cs.cmu.edu/~rwh/
http://www.haskell.org/haskellwiki/Zipper
http://community.livejournal.com/ru_lambda/119596.html
http://www.eecs.usma.edu/webs/people/okasaki/pubs.html
http://books.google.com/books/about/Purely_functional_data_structures.html?id=SxPzSTcTalAC
http://www.cs.cmu.edu/~rwh/
http://www.haskell.org/haskellwiki/Zipper
http://community.livejournal.com/ru_lambda/119596.html
http://www.eecs.usma.edu/webs/people/okasaki/pubs.html
http://books.google.com/books/about/Purely_functional_data_structures.html?id=SxPzSTcTalAC
Thursday, May 28, 2009
Lambda resources
Lambda Calculus and Lambda Calculators (implementation)
Type system
Type system
The Lambda-calculus, Combinatory Logic, and Type Systems
Комбинаторы - это просто!
Практика функционального программирования
Выпуск 1, 2009
http://www.scribd.com/doc/44147436/Functional-Programming-Russian
Lambda in short
Комбинаторы - это просто!
Практика функционального программирования
Выпуск 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:
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
- 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
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
Subscribe to:
Posts (Atom)
Powered by Blogger.





