a bit further in typed freemonad