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

时间:2012-12-19 09:30:28

标签: haskell type-level-computation

是否可以执行类似

的操作
class T a
class U a
instance U ()
instance ( NOT U a ) => T a

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

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

编辑:正如C.A.的评论中指出的那样。麦克曼,this问题与我的完全相同。如果主持人想要关闭这个,请随意。

1 个答案:

答案 0 :(得分:11)

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

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

class TypeEq a b result | a b -> result

仅在TypeEq a b Truea~b,而TypeEq a b False

所以你可以写

instance (TypeEq () a False) => T a

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

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