
Today, I was plugging away on a program and I ran into a problem. It seems that ErrorT can or can not take a type synonym as its monad, depending on how the type synonym was defined. For example, consider this GHCi interactive run:
:k Maybe Maybe :: * -> * let { a :: ErrorT String Maybe Bool; a = undefined } :t a a :: ErrorT String Maybe Bool
:k State (Scope VVar) State (Scope VVar) :: * -> * let { a :: ErrorT String (State (Scope VVar)) Bool; a = undefined } :t a a :: ErrorT String (State (Scope VVar)) Bool
ScopeState is defined in a file as:
type ScopeState a = State (Scope VVar) a
:k ScopeState ScopeState :: * -> * let { a :: ErrorT String ScopeState Bool; a = undefined }
<interactive>:1:6: Type synonym `ScopeState' should have 1 argument, but has been given 0 In the type signature: a :: ErrorT String ScopeState Bool Now, I was going to ask something like, "How can I define my type synonym so I can do this," but I figured out while writing this email that if I define ScopeState a different way:
type ScopeState = State (Scope VVar)
:k ScopeState ScopeState :: * -> * let { a :: ErrorT String ScopeState Bool; a = undefined } :t a a :: ErrorT String ScopeState Bool
So, my new question is: Why does it matter how ScopeState is defined? Bryan Burgers