А пример... Ну, вот сегодня. Сочинял комбинатор threadS startstate transformer inputs.
Протягиватель threadS получает трансформер входного состояния и значения из inputs в выходное плюс некоторый выход, стартовое состояние, входы и должен выдать наружу выходные результаты трансформера. Ну, и состояние протягивается через всю бесконечныю цепочку.
Первый вариант:
threadS startstate transformer inputs = ...
where
f i s = runSSt (transformer i) s
Это как раз то протягивание состояния.
У нас есть комбинатор zipS :: S a -> S b -> S (a,b) и mapS :: (a -> b) -> S a -> S b.
Мы можем собрать входы и входные состояния вместе через zipS и применить к ним mapS f, только f надо немного поменять:
threadS startstate transformer inputs = ...
where
inputsstates = zipS inputs states
outsstates = mapS f inputsstates -- :: S (o,s)
f (i,s) = runSSt (transformer i) s
Выходные состояния получить просто, также, как и выходы:
threadS startstate transformer inputs = outs
where
inputsstates = zipS inputs states
outsstates = mapS f inputsstates -- :: S (o,s)
states' = mapS snd outsstates -- :: S s
states = delayS startstate states' -- :: S s
outs = mapS fst outsstates -- :: S o
f (i,s) = runSSt (transformer i) s
Типы данных использовались постольку-поскольку - что-то надо сгруппировать, чтобы можно было применить mapS, из чего-то, наоборот, выдрать составную часть...
no subject
Date: 2006-07-05 03:10 pm (UTC)А пример... Ну, вот сегодня. Сочинял комбинатор
threadS startstate transformer inputs
.Протягиватель
threadS
получает трансформер входного состояния и значения изinputs
в выходное плюс некоторый выход, стартовое состояние, входы и должен выдать наружу выходные результаты трансформера. Ну, и состояние протягивается через всю бесконечныю цепочку.Первый вариант: Это как раз то протягивание состояния.
У нас есть комбинатор
zipS :: S a -> S b -> S (a,b)
иmapS :: (a -> b) -> S a -> S b
.Мы можем собрать входы и входные состояния вместе через
zipS
и применить к нимmapS f
, толькоf
надо немного поменять: Выходные состояния получить просто, также, как и выходы: Типы данных использовались постольку-поскольку - что-то надо сгруппировать, чтобы можно было применить mapS, из чего-то, наоборот, выдрать составную часть...Вот как-то так я и пишу. ;)