Different behavior between type application and type annotation.
Consider this code:
{-# LANGUAGE FlexibleInstances, TypeApplications #-}
module Bug where
class Foo t where
foo_ :: (IO () -> IO ()) -> t
instance (Show a, Foo t) => Foo (a -> t) where
foo_ k a = foo_ (\continue -> k (print a >> continue))
instance Foo (IO ()) where
foo_ k = k (return ())
foo :: Foo t => t
foo = foo_ id
bar = foo () (Just "bar") [()] :: IO ()
baz = foo @(IO ()) () (Just "baz") [()]
bar
is accepted by GHC while baz
is rejected:
* Couldn't match expected type `() -> Maybe [Char] -> [()] -> t'
with actual type `IO ()'
* The function `foo' is applied to four arguments,
but its type `IO ()' has none
In the expression: foo @(IO ()) () (Just "baz") [()]
In an equation for `baz': baz = foo @(IO ()) () (Just "baz") [()]
* Relevant bindings include baz :: t (bound at bug.hs:19:1)
|
19 | baz = foo @(IO ()) () (Just "baz") [()]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Why so?
Trac metadata
Trac field | Value |
---|---|
Version | 8.2.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |