Uniplate для рекурсивных данных
Feb. 8th, 2010 10:16 amАналог uniplate, не зацикливающийся на рекурсивных данных. На основе кода
permea_kra (спасибо!).
Код на hpaste (отсюда)
Пример использования
Работаем...
Ключевые слова: SYB, StableName, unsafePerformIO
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Код на hpaste (отсюда)
Пример использования
data Rose = Rose { roseId :: Int, roses :: [Rose] } deriving (Data,Typeable) testRose = let a = Rose 1 [b,c] b = Rose 2 [a,c] c = Rose 3 [a,b] in a
Работаем...
> [id | Rose id _ <- recUniplate testRose] [1,2,3]
Ключевые слова: SYB, StableName, unsafePerformIO
Partial signatures
Jan. 13th, 2010 12:35 pm![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Смысл в том, чтобы иметь возможность задавать отдельный констрейнт на тип функции, а всё остальное пусть выведется автоматически.
Второй случай рулит.
Proxy pattern in Javascript
Apr. 10th, 2009 03:59 pmА нет в javascript чего то вроде питоновского __getattr__ или смолтолкового doesNotUnderstand? Нужно, например, прокси соорудить, а механизма получения методов проксируемой сущности нет. Так что их руками передавать?
UPD: оборачиваемый объект удалённый. То, что у него есть какой-то метод становится известно только в момент вызова.
UPD: оборачиваемый объект удалённый. То, что у него есть какой-то метод становится известно только в момент вызова.
Interruptable state
Feb. 19th, 2009 08:35 pmПонадобилось мне состояние, вычисление которого можно прервать в любой момент. Комбинатор
Вот как тут описать комбинатор
( Read more... )
guard
не подходит тем, что его просто нет для State
. if/then/else
не устравает, потому что иногда прерывать необходимо в любом месте, например, в одной из вызываемой функции рекурсивной функции:loop = do modify (+1) check loop check = do s <- get if s == 42 then interrupt else return ()
Вот как тут описать комбинатор
interrupt
?downcasting
Feb. 5th, 2009 12:15 pmDowncasting - операция, как известо, опасная. К сожалению, совсем избавиться от неё нельзя1. Например, в случае, если мы работаем с колбэками, принимающими параметры, типы которых надо понизить в самих колбэках. Или вспомним обычный метод
Но, раз нельзя избавиться, то мы можем по крайней мере постараться снизить его опасность.
( Read more... )
equals
в Java.Но, раз нельзя избавиться, то мы можем по крайней мере постараться снизить его опасность.
На RSDN я очередной раз дискутировал с VladD2 и, кстати, для меня дискуссия получилась довольно полезной. Речь шла, в частности, и о Haskell. Один из необсуждённых (пока?) тезисов высказал VladD2:
Смысл в том, как я понял, что чем ближе инструмент "к математическому смыслу", тем дальше он от практического. Я с этим совершенно не согласен, однако быстро доказать его неправоту не могу. Поэтому попробую продемонстрировать практичность математического аппарата.
( Read more... )
Лично по мне так чем дальше инструмент от математического смысла, тем лучше.
Смысл в том, как я понял, что чем ближе инструмент "к математическому смыслу", тем дальше он от практического. Я с этим совершенно не согласен, однако быстро доказать его неправоту не могу. Поэтому попробую продемонстрировать практичность математического аппарата.
Бананы, сорок лет одни бананы...
Feb. 2nd, 2009 10:52 pmК чему я так подробно расписывал получение свёртки для розы? Очевидно, что интуитивно получить её можно сразу. Так я обычно и делаю, воспользовавшись методом размерностей, пардон, программированием "от типов". Возможно, так делаете и вы. Я хочу показать главный недостаток этого подхода - он неформален.
( Read more... )
В данном конкретном случае нам очень сильно помогает Curry-Howard, но он не гарантирует уникальности доказательства (реализации), т.е. этот метод не формализуем. А вот на основе ТК, думаю, можно построить CataEval.
В данном конкретном случае нам очень сильно помогает Curry-Howard, но он не гарантирует уникальности доказательства (реализации), т.е. этот метод не формализуем. А вот на основе ТК, думаю, можно построить CataEval.
Parsec3 траблы
Aug. 1st, 2008 07:04 pm3-й parsec, как известно, построен для работы с Data.ByteString, что должно неимоверно поднять скорость парсинга, по сравнению с обычным строковым.
( Посмотрим, так ли это на самом деле )
Расширения классов типов. Конспект.
Jul. 29th, 2008 03:54 pmРасширения типа fundep или MPTC обычно понятны бывают сразу, ну, по крайней мере, их идея. А вот чтобы разобраться с ошибками при инстанциировании класса, придётся разобраться.
( Read more... )
Partial function
Jul. 22nd, 2008 03:13 pmЯ вот жаловался
thesz, что в Haskell нет аналога partial function в Scala, чтобы можно было легко строить конструкции аналогично Erlang'овского receive (я говорю о синтаксисе). Однако механизмы есть. Правда, я нашёл пока только для IO.
Список здесь всего лишь пример, можно сделать и по другому (varargs?)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
import Prelude hiding (catch) import Control.Exception e `patternFail` h = e `catch` \(PatternMatchFail _) -> h apply handlers = \x -> foldl1 patternFail (map ($x) handlers) -- *Main> apply [\[1]->putStrLn "a", \[2]->putStrLn "b", \[3]->putStrLn "c"] [2] -- b
Список здесь всего лишь пример, можно сделать и по другому (varargs?)
Type families
Jul. 22nd, 2008 02:40 pmТолько недавно понял, что это то же самое, что и GADT:
Только их ещё и расширять можно. Так что алгебраические типы данных, которые можно выписывать в разных модулях уже есть :-)
data Z data S n data family List n a data instance List Z a = Nil data instance List (S n) a = Cons a (List n a) --например cadr :: List (S (S n)) a -> a cadr (Cons _ (Cons x _)) = x
Только их ещё и расширять можно. Так что алгебраические типы данных, которые можно выписывать в разных модулях уже есть :-)
об абстрагировании
Feb. 25th, 2008 06:14 pmХаскель предлагает достаточно удобный для большинства задач уровень абстракции - алгебраические типы, сравнение с образцом, классы типов. Забираясь выше, легко попасть в ловушку не решения проблемы предметной области, не достижения цели, а решения проблемы отображения решения проблемы предметной области на фиксированный уровень абстракции и ни ангстремом ниже.
Здесь (
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
typechecker для dependent types system
Jan. 27th, 2008 01:32 amЗаинтересовал меня всё таки
kurilka тотальным ФП, а у
deni_ok и
thesz я понахватался ссылок и умных слов. Ну, ещё и dependent types в стороне не остались.
Подумал, что total fp будет неплохо смотреться для программирования на типах - гарантия завершения будет тут очень кстати.
К сожалению, "по семейным обстоятельствам" я сейчас не в силах заняться чем нибудь серьёзно, поэтому всё, что я здесь пишу - скорее для себя, чтобы не забыть. Написано очень нудно (это тоже для себя, извините - я тупой) и сумбурно (а это так получилось).
Итак что здесь? (чтобы вы решили читать или нет)
Здесь размышления о том, как должен работать тайпчекер в системе с зависимыми типами. Я пытаюсь придумать приёмы, позволяющие строить гарантировано завершающиеся доказательства/опровержения.
( Итак, о чём думал, пока ужинал макаронами. )
Если у кого то есть материалы по теме, накидайте сюда плз - потом как руки дойдут обязательно прочту всё-всё-всё :-)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Подумал, что total fp будет неплохо смотреться для программирования на типах - гарантия завершения будет тут очень кстати.
К сожалению, "по семейным обстоятельствам" я сейчас не в силах заняться чем нибудь серьёзно, поэтому всё, что я здесь пишу - скорее для себя, чтобы не забыть. Написано очень нудно (это тоже для себя, извините - я тупой) и сумбурно (а это так получилось).
Итак что здесь? (чтобы вы решили читать или нет)
Здесь размышления о том, как должен работать тайпчекер в системе с зависимыми типами. Я пытаюсь придумать приёмы, позволяющие строить гарантировано завершающиеся доказательства/опровержения.
Если у кого то есть материалы по теме, накидайте сюда плз - потом как руки дойдут обязательно прочту всё-всё-всё :-)
Для equational reasoning в Haskell можно (иногда нужно) пользоваться GHC Rules (На Haskellwiki), чтобы написанное было читабельным и maintainable, а скомпилированное эффективным. А для нахождения нужных правил можно воспользоваться Theorem for Free. Например, его автоматической выводилкой. Или использовать free / ft команды lambdabot-а.
К сожалению, что нибудь более-менее автоматического для типов, отличных от стандартных, я найти не могу. Остаётся или выводить правила руками, или строить по аналогии со стандартными, а затем проверять на корректность.
Это я всё мечтаю. Нарисовал нужные типы данных, сформировал по ним типы функций для работы над ними, автоматически построил их реализацию, автоматически построил правила, выбрал нужные для оптимизации. А дальше работаешь легко и непринуждённо. Это идеал, разумеется. Но я уверен, что частично эту работу можно автоматизировать. Типа того, что при доказательстве Coq'ом ему надо указывать стратегии, так же и здесь при реализации тела функции надо направлять "думатель".
Это вообще возможно? А то у меня каша в голове.
К сожалению, что нибудь более-менее автоматического для типов, отличных от стандартных, я найти не могу. Остаётся или выводить правила руками, или строить по аналогии со стандартными, а затем проверять на корректность.
Это я всё мечтаю. Нарисовал нужные типы данных, сформировал по ним типы функций для работы над ними, автоматически построил их реализацию, автоматически построил правила, выбрал нужные для оптимизации. А дальше работаешь легко и непринуждённо. Это идеал, разумеется. Но я уверен, что частично эту работу можно автоматизировать. Типа того, что при доказательстве Coq'ом ему надо указывать стратегии, так же и здесь при реализации тела функции надо направлять "думатель".
Это вообще возможно? А то у меня каша в голове.
Опять про паттерн матчинг
Jun. 18th, 2007 05:13 pmНа RSDN технические работы.
( Read more... )
P.S. А ещё я сегодня видел в метро парня, читавшего распечатку "Знакомство с языком Haskell" или что то в этом духе ;-)
P.P.S. А ещё я подумал, что изобрёл слово "индексикация" как перевод indexitis (болезнь использования (!!) в Haskell), а оно оказывается существует реально и означает совсем-совсем другое :-(
P.S. А ещё я сегодня видел в метро парня, читавшего распечатку "Знакомство с языком Haskell" или что то в этом духе ;-)
P.P.S. А ещё я подумал, что изобрёл слово "индексикация" как перевод indexitis (болезнь использования (!!) в Haskell), а оно оказывается существует реально и означает совсем-совсем другое :-(
Задачка со свёрткой
May. 21st, 2007 03:58 pmЧитал статью Bernie Pope "Getting a Fix from the Right Fold" из The Monad. Reader Issue 6. В ней решается задачка о написании
У меня удивительно быстро получилось решить эту задачку. Решение было эквивалентным решению 2 в статье.
( Подглядеть )
dropWhile
через foldr
. В частности, эта задачка решалась в Graham Hutton "A Tutorial on the Universality and Expressiveness of Fold" через таплы.У меня удивительно быстро получилось решить эту задачку. Решение было эквивалентным решению 2 в статье.