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?