metaclass: (Default)
[personal profile] metaclass
А вот, тащемта, можно ли и каким образом на хаскеле можно сделать обобщенную функцию такого вида:

На вход подается список функций разных типов, но общей структуры вроде такой:
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 и прочую олеговщину. Причем я в это утыкаюсь регулярно - то с оперденями, то вот сейчас с обработкой сигналов.

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

Date: 2012-05-19 08:42 am (UTC)
From: [identity profile] metaclass.livejournal.com
Похоже на то, да.

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

?

Date: 2012-05-19 08:26 am (UTC)
From: [identity profile] thedeemon.livejournal.com
По условию у каждого элемента списка a b c d разные.
Нужно сделать их в определенном смыле одинаковыми. В ООП это делают интерфейсы, в хаскеле должны делать классы типов.

Date: 2012-05-19 08:28 am (UTC)
From: [identity profile] yantayga.livejournal.com
Ну да, я не стал выписывать классы типов. :) Полиморфизм и так виден из объявления ;)

Date: 2012-05-19 08:48 am (UTC)
From: [identity profile] lionet.livejournal.com
В частности, «a» будет зафиксирован внутри списка (список гомогенный же), то есть, сделать список из разных функций не получится. Try it.

Date: 2012-05-19 10:54 am (UTC)
From: [identity profile] yantayga.livejournal.com
Вот так? http://yantayga.livejournal.com/49911.html

Date: 2012-05-19 09:02 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Нет его там. Если у первого элемента a=Int, то у второго a=Double не получится.

Date: 2012-05-19 08:44 am (UTC)
From: [identity profile] metaclass.livejournal.com
Я так понимаю, что a,b,c,d во всех передаваемых функциях должны быть одинаковы?

Date: 2012-05-19 11:03 am (UTC)
From: [identity profile] yantayga.livejournal.com
Да. Но я сделал другой вариант - http://yantayga.livejournal.com/49911.html , праа мне оно как то не очень нравится

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

Date: 2012-05-19 09:15 am (UTC)
From: [identity profile] metaclass.livejournal.com
Там будет что-то с ручной работой типа:
f (f1,f2) (input1, input2) =
 do out1<- f1 input1
      out2<- f2 input2
      return out1,out2

хотя вообще выглядит приемлемо, написать руками таких комбинаторов и посмотреть что получится

Date: 2012-05-19 09:44 am (UTC)
From: [identity profile] migmit.livejournal.com
Обязательно список? Бинарный оператор не пойдёт?
(<^>) :: (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 <^>...

Date: 2012-05-19 09:46 am (UTC)
From: [identity profile] migmit.livejournal.com
Блин. s/(o1, 2)/(o1, o2)/. Мимо кнопки попал.

Date: 2012-05-19 09:59 am (UTC)
From: [identity profile] metaclass.livejournal.com
Такс, а на выходе такой цепочки у нас не получится состояние вида (((((s1,s2),s3),s4...) ?

Date: 2012-05-19 10:01 am (UTC)
From: [identity profile] migmit.livejournal.com
Получится, конечно. А чем плохо?

Date: 2012-05-19 10:11 am (UTC)
From: [identity profile] metaclass.livejournal.com
Средствами хаскеля сплющить кортеж обобщенным образом же невозможно вроде?

Date: 2012-05-19 11:06 am (UTC)
From: [identity profile] yantayga.livejournal.com
Даже записать тип того что должно получиться, насколько я понимаю...

Date: 2012-05-19 11:55 am (UTC)
From: [identity profile] migmit.livejournal.com
А на кой фиг его сплющивать? Чем так-то плохо?

Date: 2012-05-19 01:10 pm (UTC)
From: [identity profile] isorecursive.livejournal.com
Ну вот вам скобочки не нравятся, да? Ну а если так:
{-# LANGUAGE TypeOperators #-}

data a :. b = a :. b deriving (Eq, Show)

(<^>) :: (s1 -> i1 -> (s1, o1)) -> (s2 -> i2 -> (s2, o2)) -> (s1 :. s2) -> (i1 :. i2) -> (s1 :. s2, o1 :. o2)
(<^>) f g ~(s1 :. s2) ~(i1 :. i2) = (s1' :. s2', o1 :. o2)
  where
    ~(s1', o1) = f s1 i1
    ~(s2', o2) = g s2 i2

moo s x = (s+1, x-1)

test = (moo <^> moo <^> moo) (1 :. 2:. 3) (5 :. 5 :. 5)
    == (2 :. 3 :. 4, 4 :. 4 :. 4)

Уже юзабельнее, правда? :)
Edited Date: 2012-05-19 01:11 pm (UTC)

Date: 2012-05-19 10:21 am (UTC)
From: [identity profile] miserakl.livejournal.com
Так это же и есть гетерогенный список. Вместо [] и (:) — () и (,). В гомогенном списке тип бинарного конструктора намеренно ограничен так, чтобы потребовать совпадение типов всех элементов.

Функции транслируются практически дословно, только перегрузить надо:
class HeteroList a where
    heterolength :: a-> Int
instance HeteroList () where
    heterolength _ = 0
instance HeteroList b => HeteroList (a,b) where
    hetrolength (x,y) = 1+heterolength y
Типа такого.

Date: 2012-05-19 10:23 am (UTC)
From: [identity profile] miserakl.livejournal.com
Ну только в конце надо дописывать функцию, действующую на юните. Или перегрузить <^>, чтобы он автоматически добавлял её в конце.

No title

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

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

Date: 2012-05-19 01:50 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Тащемта, пока кложурь для этой задачи выглядит нагляднее, причем даже без макросов.
С хаскелем непонятно. Странные многоуровневые туплы на выходе гетерогенных списков напрягают.

Date: 2012-05-19 01:55 pm (UTC)
From: [identity profile] yantayga.livejournal.com
Так и без туплов можно ж...

Date: 2012-05-19 01:57 pm (UTC)
From: [identity profile] yantayga.livejournal.com
А может скорее тут нужно не пытаться решать эту задачу на Хаскеле "в лоб", а как то переформулировать? Учитывая ее корни и т. п., чтоб там вообще не возникало разнотиповых функций, например. Посмотреть какие ограничения еще могут присутствовать на условия, а не пытаться объять необъятное.
Edited Date: 2012-05-19 01:59 pm (UTC)

Date: 2012-05-19 02:03 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Надо подумать, да.
А то я по пути наименьшего сопротивления пока использую Clojure, но очень уж интересно эти задачи в строгой типизации и ленивости оформить. Правда, скажем, с ком-портом на хаскеле получилась ересь - либо tight-coupling (т.е. логика и обмен с внешним миром никак не разделены) либо адовы iteratees и аттопарсеки с багами.

Date: 2012-05-19 02:40 pm (UTC)
From: [identity profile] isorecursive.livejournal.com
"Многоуровневость" тупла - это и есть отраженная в типах гетерогенность.

Date: 2012-05-19 02:42 pm (UTC)
From: [identity profile] theiced.livejournal.com
ну так и не взрывай моск. а то разведёшься, переедешь к родителям и будешь устраивать митинги для открытия азбуки вкуса пососедству.

Date: 2012-05-20 01:35 am (UTC)

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 24th, 2025 05:01 am
Powered by Dreamwidth Studios