Skip to content

Cannot deduce constraint from itself with poly-kinded type family

Compiling

{-# LANGUAGE PolyKinds, TypeFamilies #-}

module Eq where

type family F a :: k where

withEq :: F Int ~ F Bool => a
withEq = undefined

gives an arguably confusing error message:

Eq.hs:7:11: error:
    • Could not deduce: F Int ~ F Bool
      from the context: F Int ~ F Bool
        bound by the type signature for:
                   withEq :: forall k a. (F Int ~ F Bool) => a
        at Eq.hs:7:11-29
      NB: ‘F’ is a non-injective type family
      The type variable ‘k0’ is ambiguous
    • In the ambiguity check for ‘withEq’
      To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
      In the type signature: withEq :: F Int ~ F Bool => a

I'm not claiming this program should necessarily typecheck, but "Cannot deduce X from the context X" induces head-scratching.

Replacing k with * in the definition of F makes the error go away.

Trac metadata
Trac field Value
Version 8.6.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information