|
Лямбда - функциональное программирование
|
|
|
| (no subject) |
[May. 28th, 2012|05:47 pm] |
Есть у меня некие типы данных, условно говоря, такие
data T1 = Q | B String | R | ........ data T2 = Left | Right | Potato Int | ..... data TT = TT T1 T2
Нужен мне для работы тип ТТ, но в силу специфики предметной области в 99% процентов случаев это будет одна из 20-30 комбинаций, поэтому мне удобно завести функции вида
f1 = TT Q Left f2 = TT Q (Potato 7) f3 = TT R Right ... f20 = TT (B "Last One") (Potato 0)
чтобы количество текста сократить, тем более, что все эти f1 - f20 - устоявшиеся и всем известные названия; кроме того хочется мне при обработке типа ТТ повторно их использовать, чтобы не писать вновь 20 раз
process (TT Q Left) = ... process (TT Q (Potato 7)) = ... process (TT R Right) = ... ... process (TT (B "Last One") (Potato 0))) = ... process (TT a b) = universalProcessing a b
а иметь нечто в духе
process (id -> f1) = ... process (id -> f2) = ... process (id -> f3) = ...
и так далее.
Как такое можно сделать? |
|
|
| Coq. |
[May. 13th, 2012|11:11 am] |
Как доказать в Coq 1<=0 -> False? |
|
|
| Курочки невидимки |
[Apr. 28th, 2012|02:34 pm] |
читаю Fun with type functions; Oleg Kislov, SPJ дошел до раздела про мемоизацию, не совсем понял как она работает и стал проверять на примерчике ( Read more... )
|
|
|
| Безусловный интерпретатор LISP на LISP |
[Feb. 27th, 2012|10:32 am] |
Здравствуйте!
У меня возникла задача, которую можно сформулировать целиком в терминах языка LISP.
Требуется найти такие функции encode, decode и reduce, что
(decode (reduce … (reduce (encode (quote expr))) … ))
для некоторого конечного количества применений reduce является результатом интерпретации выражения expr, в котором можно ограничиться переменными и lambda одного аргумента, причем возвращаемое значение encode — это рекурсивное S-выражение memory с циклами без атомов, а функция reduce должна иметь следующий вид:
(lambda (memory)
(set (c[ad]*r memory) (c[ad]*r memory))
(set (c[ad]*r memory) (c[ad]*r memory))
…
(set (c[ad]*r memory) (c[ad]*r memory))
memory
) Был бы признателен за помощь в решении данной задачи.
Заранее спасибо. |
|
|
| Парсеры для Ur/Web. |
[Feb. 13th, 2012|03:57 pm] |
А как на Ur строки парсить можно?
(По идее, pure комбинаторы на Окамле могут скомпилироваться почти без изменений, но вроде всё виденное на Окамле использует ссылки и мутабельность.) |
|
|
| Haskell+web |
[Feb. 4th, 2012|11:32 am] |
Товарищи писатели вебни на хаскеле! Здесь же есть такие?
Мне нужно (для личных нужд) написать веб-приложение на хаскеле, работающее с базой. Будут храниться блобы (0.2-5 Мб) с описанием в базе (да, именно в базе, а не в файловой системе) и раздаваться авторизованным пользователям. Плюс интерфейс загрузки - отдачи, плюс контроль прав.
Существо я исключительно ленивое, поэтому чем проще в использовании будет решение, тем лучше. Какие решения вы посоветуете? А то пока я подумываю о написании CGI приложения в лоб, т.е. без сторонних библиотек, но это как-то не комильфо. |
|
|
| quick check & test data generator |
[Jan. 27th, 2012|02:50 am] |
привет, вопрос такого порядка - у меня есть несколько файлов, из которых построчно надо считать данные и сложить их в списки (скажем 5 списков)
дальше по этим спискам надо нагенерить комбинаций по 5 - выбрать случайный элемент из каждого списка и получить кортеж
курение документации и примеров по quickcheck не позволило ответить на вопрос - как передать в class Arbitrary Cortege списки, прочитанные из файла?
пока варианты - записать списки в IORef, а внутри arbitrary через unsafeIO их читать, но это какой-то аццкий хак получается.
как правильно? |
|
|
| case x of |
[Jan. 23rd, 2012|01:46 am] |
В тренировочных целях пишу парсер простенького бинарного формата и столкнулся с не очевидным, для меня, поведением. Я побитово читаю данные и перевожу автомат между состояниями: parse :: Word8->ParseState->ParseState и получении некотрых конкретных значений - я меняю состояние.
Сами эти значения я записал заранее:
data State = S1|S2|S3
b1 = 123
b2 = 213
parse b s = case (b, s) of
(b1, S1) -> S2
(_ , S1) -> S3
(b2, S2) -> S1
При этом оказывается что (parse 2 S1) = S2 , хотя я хочу что бы сработало второе правило. причину такого поведения я кажется понял, теперь хотелось бы найти способ столь же красиво и лаконично это записать. |
|
|
| [F#] Скрестить комбинаторы с FsYacc |
[Jan. 18th, 2012|06:39 pm] |
Имеется парсер на комбинаторах. Предположим что восстановить грамматику из комбинаторов мы можем. Хочется (автоматически) заменить код на комбинаторах на вызов FsYacc.
Проблема: Парсер комбинаторы парсят потоки Char а FsYacc хочет полноценный лексер (lexbuf и функцию из lexbuf в токены) Возможное решение: навелосипедить свою библитеку комбинаторов, где она будет принимать что-то лексероподобное, но посложнее чем просто поток символов. Ещё возможное решение: Оставить поток сиволов как есть, а некоторые парсер функции считать кусками лексера и превращать в регулярки, например. Т.е. из комбинаторов генерить свой лексер.
Лично мне первое какжется по-проще.
А вы бы как сделали?
P.S. Чуть по-конкретнее, ибо меня уже завалили вопросами. На входе: дотнетовский класс, где методы --- это парсер-функции (т.е. имеют тип _ -> result) На выходе: дотнетовский класс, где вызовы некоторых методов подменены на вызовы fsyacc (Но типы те же и снаружи кажется, что ничего не поменялось)
Здесь "некоторые методы" это методы, которые программист захотел сделать на fslex. Основные грабли: fsyacc ходит парой с fslex. А комбинаторы обычно парсят сразу поток сиволов (без токенизации, т.е. им лексер не нужен) Т.е. надо или как-то навелосипедить свои комбинаторы которые принимают не поток символов, а что-то лексеро-подобное. Либо из кода комбинаторов получать тем или иным образом информацию о лексере и генерить кроме кода на fsyacc код для fslex (что-то звучит страшновато)
Надеюсь что-то прояснилось. |
|
|
| navigation |
| [ |
viewing |
| |
most recent entries |
] |
| [ |
go |
| |
earlier |
] |
| |
|
|