колдунство реификации

Jul 23, 2013 22:53

Дамы и господа! Не проходите мимо! Только сегодня в нашем бродячем цирке великий йог и аскет Лямбдагарбха продемонстрирует уникальный фокус материализации! Имея полиморфную функцию, оперирующую произвольными типами (полифорфными, не конкретными), функциями из них и туплами, только зная ее тип и умея ее вызывать, он материализует ее исходник, даже ( Read more... )

haskell, fp

Leave a comment

Comments 31

xeno_by July 23 2013, 19:00:52 UTC
К вопросу, где это может быть применимо: http://scala-lms.github.io/. (Наверняка, уважаемый автор про сабж знает, поэтому я, в основном, для читателей).

Reply

xeno_by July 23 2013, 19:03:47 UTC
Ага, тут не совсем то! Сигнатура оригинальной функции не меняется и все равно ее получается реифицировать!

Reply

xeno_by July 23 2013, 19:25:13 UTC
Что-то похожее на Lancet, не так ли? https://github.com/tiarkrompf/lancet (там на главной странице есть ссылка на научную работу)

Reply


ex_juan_gan July 23 2013, 19:08:53 UTC
О блин. Запрограммировали всё, что можно запрограммировать.

Reply


xeno_by July 23 2013, 19:10:19 UTC
Кстати, а как настоящие йоги представляют сниппеты кодяры, которые сами по себе не тайпчекаются?

1) Полезно иметь возможность наколбасить в разных местах кусочки кода, которые потом объединяются в единое целое. Зачастую выходит так, что эти кусочки имеют смысл только в контексте других (например, используют переменные, объявленные где-то еще), поэтому выразить их в виде HOAS не получится. Что делать?

2) Также полезно в научных целях разбирать сниппеты на запчасти. Как это записать в HOAS? Как таким запчастям назначить типы?

Reply

thedeemon July 23 2013, 19:43:52 UTC
Хороший вопрос. Полагаю, настоящие йоги не допускают даже мыслей о нетайпчекающихся сниппетах. Оперируй замкнутыми термами, так познаешь Брахмана!

Reply


xeno_by July 23 2013, 19:24:04 UTC
Получается, что для реализации своего трюка ты: 1) собираешь реифицированную сигнатуру руками, 2) выщемливаешь из нее аргументы, которые не стыдно передать в функцию, 3) вызываешь функцию, по сути, выполняя symbolic execution, 4) выщемливаешь из сигнатуры возвращаемый тип и на основе него обрабатываешь результат вызова функции. Правильно?

А теперь вопрос. Можно ли сделать такой реифай, чтобы можно было написать просто "reify myfun", без всяких многоточий? Можно ли реифицированную сигнатуру генерировать каким-нибудь хитрым тайпклассом, например?

Ну и плюс. Как это обобщить для конкретных типов, например, если myfun принимает Int и возвращает Int?

Reply

thedeemon July 23 2013, 19:49:35 UTC
Вроде того.

Просто "reify myfun" было бы здорово, но как этого добиться я пока не знаю.

С конкретными типами эта магия не работает, ибо все строится на том, что передаваемая функция всеядна и переварит волшебную пилюлю. Так что практического применения тут немного, только в цирке выступать.

Reply


xeno_by July 23 2013, 19:43:32 UTC
>>Опытный глаз сразу заметит в app знакомый метод <*> аппликативного функтора. А вот функция с обратным типом - lam - гораздо менее знаменита.

Можешь вот это пояснить? Получается, есть какая-то алгебраическая структура, соответствующая метапрограммированию (т.е. манипуляциям над Code[T])? Какие у нее есть интересные законы?

Reply

thedeemon July 23 2013, 19:52:31 UTC
Речь об этом:
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Applicative.html

Об аппликативных функторах (коими в ЯП все монады являются, в частности) и их чудодейственных свойствах написаны тома.

Reply


Leave a comment

Up