A sig is a value inside a monad. That's really all. Sig m a, where m' = Sig m a -> Sig m a I tried this before. So what is bind? I keep going back to flattening lists. That doesn't work. Can't flatten infinite lists.. There is another way to make a list into a monad, right? But there is a stream instance: http://stackoverflow.com/questions/11684759/definition-of-the-monad-instance-of-data-stream It takes the "main diagonal".