通过`TypeError`约束消除

问题描述

我想使用onCreateOptionsMenu()约束使“非实例”产生更有意义的类型错误:

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 = _ 约束进行消除来填充它,即利用我在范围上有TypeError约束这一事实来避免写{{1} }或TypeError或类似版本。

有可能吗?

解决方法

我认为标准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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...