Monomorphic Pattern Bindings and Error Messages
Not clear to me if the following should be a type error or if it should be allowed to unify properly. In either case, the error message is borked.
{-# OPTIONS -fglasgow-exts #-}
module Test where
data Foo x y = Foo {foo1 :: x, foo2 :: y}
instance Functor (Foo x) where
fmap f (Foo x y) = Foo x (f y)
bar :: a -> Foo (forall s. s) a
bar a = Foo undefined a
main = print (foo2 (fmap (*2) (bar 2)))
{-
sclv.hs:12:20:
Cannot match a monotype with `forall s. s'
When matching `forall s. s'
and `forall s. s'
Expected type: Foo (forall s1. s1) a
Inferred type: Foo (forall s1. s1) a
In the first argument of `foo2', namely `(fmap ((* 2)) (bar 2))'
-}
*Test> :t bar (2 :: Integer)
bar (2 :: Integer) :: Foo (forall s. s) Integer
*Test> :t foo2 (bar (2 :: Integer))
foo2 (bar (2 :: Integer)) :: Integer
*Test> :t fmap (*2) (bar (2 :: Integer))
fmap (*2) (bar (2 :: Integer)) :: Foo (forall s. s) Integer
*Test> :t foo2 (fmap (*2) (bar (2 :: Integer)))
<interactive>:1:6:
Cannot match a monotype with `forall s. s'
When matching `forall s. s'
and `forall s. s'
Expected type: Foo (forall s1. s1) Integer
Inferred type: Foo (forall s1. s1) Integer
In the first argument of `foo2', namely
`(fmap ((* 2)) (bar (2 :: Integer)))'
Trac metadata
Trac field | Value |
---|---|
Version | 6.8.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Multiple |
Architecture | Multiple |