Type synonyms cannot be partially applied.
A type synonym is just a short hand to help a programmer, not something that actually exists, as the Haskell language says. The only way that Haskell can deal with a type synonym is to βbrowseβ it to see the type on the right side. The options just give you a kind of macro language.
So Maybe' a is exactly equivalent to forall b. (b -> (a -> b) -> b) forall b. (b -> (a -> b) -> b) . It behaves the same as if you wrote forall b. (b -> (a -> b) -> b) forall b. (b -> (a -> b) -> b) . But what is Maybe' its own without an argument? Haskell can't handle it like Maybe' , he will have to replace it with something else. But what? If it meant anything, it would have to be something like \a ~> (forall b. (b -> (a -> b) -> b) , where I use \a ~> ... as a pseudo-syntax for level-level lambda; an arbitrary function from type to another type. The reason I had to compose the syntax is because Haskell has no syntax for this, and the reason it has no syntax is that it cannot handle fully general level functions.
I'm not sure if supporting level-level lambdas types (type constructors and type families are actually very limited forms of this) would be virtually impossible, but it is certainly very difficult. Thus, type synonyms cannot be partially applied.
To get something that a Monad instance can do (which requires something that can be applied to the type to make the type something like * -> * ), you need to use data or newtype to create the type constructor. A type synonym cannot be used for this purpose.
source share