Класс Control.Arrow.Operations.ArrowCircuit
это для:
Тип стрелки, который можно использовать для интерпретации синхронных схем.
Я хочу знать, что здесь означает синхронный. Я нашел это в Википедии, где говорится о цифровой электронике. Моя электроника довольно ржавая, поэтому вот вопрос: что не так (если что-то не так) с таким экземпляром для так называемых асинхронных потоковых процессоров:
data StreamProcessor a b = Get (a -> StreamProcessor a b) |
Put b (StreamProcessor a b) |
Halt
instance Category StreamProcessor where
id = Get (\ x -> Put x id)
Put c bc . ab = Put c (bc . ab)
Get bbc . Put b ab = (bbc b) . ab
Get bbc . Get aab = Get $ \ a -> (Get bbc) . (aab a)
Get bbc . Halt = Halt
Halt . ab = Halt
instance Arrow StreamProcessor where
...
getThroughBlocks :: [a] -> StreamProcessor a b -> StreamProcessor a b
getThroughBlocks ~(a : input) (Get f) = getThroughBlocks input (f a)
getThroughBlocks _input putOrHalt = putOrHalt
getThroughSameArgBlocks :: a -> StreamProcessor a b -> StreamProcessor a b
getThroughSameArgBlocks = getThroughBlocks . repeat
instance ArrowLoop StreamProcessor where
loop Halt = Halt
loop (Put (c, d) bdcd') = Put c (loop bdcd')
loop (Get f) = Get $ \ b ->
let
Put (c, d) bdcd' = getThroughSameArgBlocks (b, d) (f (b, d))
in Put c (loop bdcd')
instance ArrowCircuit StreamProcessor where
delay b = Put b id
Я считаю, что это решение сработает для нас так: мы хотим, чтобы someArrowCircuit >>> delay b
был someArrowCircuit
задержан на один тик, а b
приходил раньше, чем что-либо из него. Легко увидеть, что мы получаем то, что хотим:
someArrowCircuit >>> delay b
= someArrowCircuit >>> Put b id
= Put b id . someArrowCircuit
= Put b (id . someArrowCircuit)
= Put b someArrowCircuit
Есть ли законы для такого класса? Если я не ошибся, записав delay
вниз, как синхронный сосуществует с асинхронным?
StreamProcessor
не синхронна, а это значит, что вы не можете говорить об отсрочке на 1 тик. Например, если вы напишетеdelay a >>> someSP
, совсем не понятно, что вывод задерживается на 1 тик. Если уsomeSP
есть несколько дополнительныхGet
, он может быть полностью не задержан, а если он 20Put
наGet
, то он может быть задержан на 20 тиков. (Примечание: функцияgetThroughBlocks
вызывает беспокойство - здесь соблюдаются ли законы ArrowLoop?) - person DDub   schedule 15.01.2021delay a >>> someSP
?someSP >>> delay a
понятно - мы просто вставляем дополнительное значение, независимо от того, будет ли оно следоватьGet
,Put
илиHalt
:arr ([0..] !!)
ожидаетi
и возвращаетi
, тогда какarr ([0..] !!) >>> delay (-1)
сначала выплевывает-1
, а затем работает как обычно. - person Zhiltsoff Igor   schedule 15.01.2021getThroughBlocks
? Вы говорите оgetThroughSameArgBlocks
вloop
? Я не проверял определениеArrowLoop
законов - какой из них выглядит шатким? - person Zhiltsoff Igor   schedule 15.01.2021delay a >>> someSP
теоретически предоставитa
данных за один тик дляsomeSP
. В синхронной схеме это позволило быsomeSP
вычислить выходную ценность одного тика. Имейте в виду, чтоarr
дляStreamProcessor
действительно создает синхронную схему в силу того, что в ней точно чередуютсяGet
иPut
. Однако, если бы было 5Put
наGet
, тогда результаты действительно были бы асинхронными по отношению к входам, иdelay
казался бы немного странным. - person DDub   schedule 15.01.2021getThroughSameArgBlocks
. Я не знаю, какой закон может нарушиться (если таковой имеется), но меня настораживает, что вы дублируете значения из входного потока. - person DDub   schedule 15.01.2021loop
? Я тестировал свой фрагмент на процессорах сconst
s в качестве блоков - отлично работает. Я еще немного подумаю о тестировании и напишу еще один комментарий. Что касаетсяdelay
, позвольте мне поспать на этом :). Моя электроника (или что там еще) довольно ржавая, так что я не сразу пойму. Спасибо! - person Zhiltsoff Igor   schedule 16.01.2021