
Okay, I started to experiment things, and I came to some remarks: First, I cannot use bare lists, because of the way their Applicative instance is declared. I have to use the newtype ZipList (in Control.Applicative). So I have roughly this : import Control.Applicative newtype AgentSig a = AgentSig (ZipList a) deriving (Functor, Applicative) (<+>) :: a -> AgentSig a -> AgentSig a v <+> (AgentSig (ZipList sig)) = AgentSig . ZipList $ v:sig toList :: AgentSig a -> [a] toList (AgentSig (ZipList sig)) = sig fromList :: [a] -> AgentSig a fromList = AgentSig . ZipList This enables me to do things like : agent3 a b = (/) <$> a <*> b run = z where x = agent1 y y = 100 <+> agent2 x z = agent3 x y One problem though: How to make an instance of Monad out of AgentSig?