=A=L=X=
> что за языки такие где игрек-комбинатор востребован
Уж если в крестах он не востребован, уж в схемке то точно он не особо нужен.
http://ideone.com/vQWhYn
#include <iostream> #include <functional> using namespace std; //fix :: (a -> a) -> a //fix f = let x = f x in x //fac = fix $ \f n -> if (n <= 0) then 1 else n * f (n - 1) //fac = let f n = if (n <= 0) then 1 else n * f (n - 1) in f //=========================================================== //fac = let f n = if (n <= 0) then 1 else n * f (n - 1) in f int fac(int n) { /*let*/ function<int( int)> f = [&]( int n){ if ( n <= 0) return 1; else return n * f ( n - 1);}; /*in*/ return f( n); } int main( ) { cout<<fac( 5)<<endl; return 0; }
=A=L=X=
хотя я полистал интернет...
letrec разворачивается как раз через Y комбинатор
либо с использованием мутабельности, так что да разница с хаскелем есть
но... тут есть одно важное замечание
let в хаскеле это не letrec
это let
а работает он изза ленивости языка
результат не вычисляется пока не нужен
к примеру
в хаскеле будет работать
let x = 1:x in x
и можно даже из получившегося бесконечного списка взять сотый элемент
(let x = 1:x in x)!!100
laMer007
> Уж если в крестах он не востребован, уж в схемке то точно он не особо нужен.
ненене
стоп это сравнение бред
конструирование объекта на стеке это ни разу не связывание имени
Да ладно уже хватит обсуждать саму концепцию нужности/ненужности.
Комбинатор я привел просто как пример кода который пятистрочный, который вроде простой, рекурсивный несомненно и насквозь ФП-нутый, а смысл был в том что на нём рассеиваются все иллюзии что рекурсия-это просто-ествененно, легко понимать, лучше усваивается мозгами, помогает проектировать безглючные приложения на гора из под полы и тому подобное и так далее. Предел сложности тут для моего мозга состоялся в пяти строчках кода, я иногда возвращаюсь к нему по полчаса, уже суммарно часа два потому говорю и набил, но в мозги не пролазит. Просто как пример. Ничего иного как сложности. Причём еще раз замечу - я именно что статьи читал и там всё по шагам, всё разжевано какбе, многое понятно, но как доходит до финальной формы - мозг отказывает её хотя бы итерацию прогнать одну хотя бы.
cNoNim
> конструирование объекта на стеке это ни разу не связывание имени
Ох тыж беда какая. Производительность точно просядет. Думаю придётся прикупить сеть распределенных сервачков для хранения на стеке одного function для одного факториала.
laMer007
> Ох тыж беда какая. Производительность точно просядет
Да не о том речь.
var x = lamba (y) { ...x ... };всегда везде было возможно
а вот попробуй:
func( x );
в этом выражении x заменить на факториал от икс не меняя код снаружи скобок.
P.S.
В С++, кстати, это уже обсуждали в той теме про комбинатор, вообще то, если бы лямбды полностью пошли по пути шотката над функтором до конца, то проблемы бы тоже не было, ибо обычный функтор без труда вызывает сам себя как (*this)(...); без какого либо гвоздя и изменения синтаксиса. Но в лямбдах this зарезервировали под другие нужды и поэтому вроде бы попали на те же грабли.
=A=L=X=
> это всегда везде было возможно без У-комбинатора
Ну тогда мы выяснили что У-комбинатор по сути не нужен. Вымышленный приём применительно к промышленному программированию.
> x заменить на факториал от икс не меняя код снаружи скобок
Что-ж. Это явно задача для специальной олимпиады. Посоны со двора явно оценят это. Согласен.
laMer007
> Что-ж. Это явно задача для специальной олимпиады. Посоны со двора явно оценят
> это. Согласен.
>Специальная олимпиада №1 (6 стр)
:)
cNoNim
> :)
Как раз кода буду создавать очередную Специальная олимпиада №2, то у меня у же будет задание от =A=L=X=.
Специальная Олимпиада (Special Olympics) — международная организация, занимающаяся вопросами организации спортивных мероприятий для лиц с умственными отклонениями.
laMer007
> Ну тогда мы выяснили что У-комбинатор по сути не нужен.
Да вообще функции не нужны. Машина Тьюринга уже полна по Тьюрингу. Чего боле то?
=A=L=X=
> Да вообще функции не нужны. Машина Тьюринга уже полна по Тьюрингу. Чего боле то?
Такое же раздувание до уровня маразма, как и Y-combinator. Не делайте на частном выводе общий вывод. А тем более на одном.
laMer007
> Такое же раздувание до уровня маразма, как и Y-combinator.
Да чё сразу маразм то? Откуда столько негатива? Безобидный приёмчик, неужели какие то проблемы?
Да и к тому же примеры применения как раз простые - тут как с шаблонами, заправил адову шаблонно-макросовую простыню в boost::function, а снаружи даже пользоваться можно!
=A=L=X=
> Безобидный приёмчик
Ну заодно и бесполезный, как мы выяснили.
=A=L=X=
> Расскажи это на пару месяцев назад поднятом примере:
> http://habrahabr.ru/post/118927/
это вчера меня лишило сна, не надо так
пример на Scala кстати:
def fix[A,B](f: (A=>B)=>(A=>B)): A=>B = f(fix(f))(_) val fact = fix[Int,BigInt](f => a => if(a<=0) 1 else f(a-1) * a) fact(12)
итт языковые астронавты
Тема в архиве.