Possible program should type check but does not using Implicit Parameters and Vectors
I think (but I'm not sure) that the following code should type check. This will require using the 'vector' package to illustrate this issue, sorry I couldn't create an example without it.
Either uncommenting the explicit m () signature or changing the type to the simpler D m data type will allow the code to compile.
{-# LANGUAGE ImplicitParams #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
import Data.Vector.Unboxed.Mutable (MVector)
import Control.Monad.Primitive (PrimMonad, PrimState)
data D (x :: * -> *)
type T m = MVector (PrimState m) Int
--type T m = D m
h :: forall m. PrimMonad m => T m -> m ()
h x = let f _ = (let ?v = x in g) {- :: m () -} in f undefined
g :: (PrimMonad m , ?v :: T m) => m ()
g = undefined
main = pure ()
Alternatively, including g into the let binding as opposed to the top level will also compile:
{-# LANGUAGE ImplicitParams #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
import Data.Vector.Unboxed.Mutable (MVector)
import Control.Monad.Primitive (PrimMonad, PrimState)
data D (x :: * -> *)
type T m = MVector (PrimState m) Int
--type T m = D m
h :: forall m. PrimMonad m => T m -> m ()
h x =
let
f _ = (let ?v = x in g) {- :: m () -}
g :: (PrimMonad m , ?v :: T m) => m ()
g = undefined
in f undefined
main = pure ()
Perhaps this isn't a bug and has to do with the rank-2 type inside of Vector, but I'm just putting in this bug report to confirm.
This is an issue as of 8.0.2-rc2.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.0.2-rc2 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |