haskell - 为除一个特定类型之外的所有类生成实例

rtp*_*tpg 13 haskell type-level-computation

是否有可能做类似的事情

class T a
class U a
instance U ()
instance ( NOT U a ) => T a
Run Code Online (Sandbox Code Playgroud)

上下文:我正在尝试编写一个函数,它接受HLists并删除某种类型的元素(这里是单元类型).

我觉得开放世界的假设可能存在一些问题,但即使能够以硬编码方式(而不是NOT U a,类似NOT~())这样做也应该是可能的.

编辑:正如CA McMann的评论所指出的,这个问题几乎与我的完全相同.如果主持人想要关闭这个,请随意.

Phi*_* JF 11

你可以使用Oleg的技巧来做到这一点,它甚至在hackage上有自己的库

通过严重滥用类型类系统,可以生成一个fundep

class TypeEq a b result | a b -> result
Run Code Online (Sandbox Code Playgroud)

这样TypeEq a b True,只有当a~b,并TypeEq a b False以其他方式

所以你可以写

instance (TypeEq () a False) => T a
Run Code Online (Sandbox Code Playgroud)

而且我认为这应该有效.我应该清楚,这种类型的平等测试在实现方式上是纯粹的邪恶,但它确实起作用.如果您想了解它的工作原理/概括它(也阅读HList文件),请查看该库的代码.

如果可以在没有负面约束的情况下做你想做的事情,那就改为做.