metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-05-19 10:59 am
Entry tags:

Хаскельно-кложурное

А вот, тащемта, можно ли и каким образом на хаскеле можно сделать обобщенную функцию такого вида:

На вход подается список функций разных типов, но общей структуры вроде такой:
f :: state -> input -> (new_state,output) (такая функция описывает блок обработки сигналов, с внутренним состоянием, типа фильтра).

На выходе наша обобщенная функция должна выдать нечто такое:
f_all :: state_all -> input_all -> (new_state_all,output_all), где state_all,input_all,output_all - объединение (кортеж) соответственно из всех состояний, входов и выходов переданных на вход функций. То бишь наша функция, из N блоков обработки сигналов делает 1 блок, входы которого - это входы всех составляющих блоков, выходы - выходы составляющих блоков и состояние аналогично.

На кложури с ее макросами и отсутствием строгой системы типов такое делается практически в лоб, за исключением необходимости описывать функции блоков в виде, доступном для преобразования (то ли через рефлекшн, то ли макрос, который опишет функцию с метаданными, то ли есть что-то встроенное). Единственный не совсем ясный вопрос - тип возвращаемого значения из кложурной функции не особо то и узнаешь.

Далее там еще есть необходимость сгенерировать описание соединений (т.е. функция, которая из state_all и части свободных входов генерирует input_all), но над этим пока думать влом)

PS: в общем, забавность ситуации в том, что строгая типизация помогла бы находить ошибки в блоках и соединениях, но с ней возникает необходимость использовать гетерогенные списки, SYB и прочую олеговщину. Причем я в это утыкаюсь регулярно - то с оперденями, то вот сейчас с обработкой сигналов.

[identity profile] jdevelop.livejournal.com 2012-05-19 08:19 am (UTC)(link)
тебе нужны будут гетерогенные списки скорее всего, и экзистенциальные типы

[identity profile] yantayga.livejournal.com 2012-05-19 08:21 am (UTC)(link)
Типа этого:
combine :: [a -> b -> (c, d)] -> [a] -> [b] -> ([c], [d])
combine fs is ss = unzip $ zipWith ($) (zipWith ($) fs is) ss

?

[identity profile] thedeemon.livejournal.com 2012-05-19 09:10 am (UTC)(link)
Я в хаскеле не силен, но упомянутые функции очень похожи на пациентов монады State (или St?). Наверняка там если покопаться, рядом найдутся методы комбинирования двух состояний в одно.

[identity profile] migmit.livejournal.com 2012-05-19 09:44 am (UTC)(link)
Обязательно список? Бинарный оператор не пойдёт?
(<^>) :: (s1 -> i1 -> (s1, o1)) -> (s2 -> i2 -> (s2, o2)) -> (s1, s2) -> (i1, i2) -> ((s1, s2), (o1, o2))
f <^> g = \ ~(s1, s2) ~(i1, i2) -> let {~(s1', o1) = f s1 i1; ~(s2', o2) = g s2 i2} in ((s1', s2'), (o1, 2))

И потом пишем f1 <^> f2 <^> f3 <^>...

No title

[identity profile] livejournal.livejournal.com 2012-05-19 10:54 am (UTC)(link)
User [livejournal.com profile] yantayga referenced to your post from No title (http://yantayga.livejournal.com/49911.html) saying: [...] Интересную задачку подкинул [...]

[identity profile] theiced.livejournal.com 2012-05-19 01:40 pm (UTC)(link)
хаскель не нужен. чота у меня есть подозрения что люди использующие хаскель - гандоны и говноеды.