代码之家  ›  专栏  ›  技术社区  ›  Cactus

按“TypeError”约束消除

  •  0
  • Cactus  · 技术社区  · 6 年前

    我想用一个 TypeError 约束使“非实例”产生更有意义的类型错误:

    {-# LANGUAGE DataKinds, KindSignatures #-}
    {-# LANGUAGE UndecidableInstances #-}
    {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
    
    import GHC.TypeLits
    import Data.Proxy
    
    class Compat (x :: Bool) (y :: Bool) where
        combine :: Proxy x -> Proxy y -> Int
    
    instance Compat False pre2 where
        combine _ _ = 42
    
    instance Compat True False where
        combine _ _ = 1
    
    instance (TypeError (Text "Meaningful error message goes here")) => Compat True True where
        combine = _
    

    类型错误 约束,即使用我有 类型错误 作用域中的约束,以避免必须写入 undefined error 或者类似的。

    有可能吗?

    0 回复  |  直到 6 年前
        1
  •  1
  •   chi    6 年前

    我不认为这是可能的标准 TypeError ,但您可以定义自己的变体( TE

    {-# LANGUAGE 
       DataKinds, UndecidableInstances,
       MultiParamTypeClasses, KindSignatures, TypeFamilies #-}
    
    import GHC.TypeLits
    import Data.Kind
    
    class Impossible where
        impossible :: a
    
    type family TE (t :: ErrorMessage) :: Constraint where
      TE t = (TypeError t, Impossible)
    
    class C t where
       foo :: t -> Bool
       
    instance (TE (Text "impossible")) => C Bool where
       foo _ = impossible
    
    推荐文章