[Haskell-cafe] Indexed monads and MonoLocalBinds
Mikhail Vorozhtsov
mikhail.vorozhtsov at gmail.com
Thu Apr 21 18:48:00 CEST 2011
Hi Cafe,
Here is another example of why 'let' should be sometimes generalised.
I've been recently playing with indexed monads (for JSON processing) and
found out that the following code fails to typecheck:
>{-# LANGUAGE MonoLocalBinds #-}
>data M t t' a = M
>ipure :: a -> M t t a
>ipure a = M
>iseq :: M t t' a -> M t' t'' b -> M t t'' b
>iseq a b = M
>np :: M () Bool ()
>np = M
>test = p `iseq` np `iseq` p
> where p = ipure ()
Test.hs:13:27:
Couldn't match expected type `Bool' with actual type `()'
Expected type: M Bool t''0 b0
Actual type: M () () ()
In the second argument of `iseq', namely `p'
In the expression: p `iseq` np `iseq` p
In practice that means that I need to provide a signature for almost
every monadic local binding that is used more than once, which is
unbearable, especially when monad transformers and complex indices are
used.<http://hackage.haskell.org/trac/ghc/blog/LetGeneralisationInGhc7>
More information about the Haskell-Cafe
mailing list