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

标签 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问题几乎与我的完全相同。如果版主想关闭这个,请随意。

最佳答案

您可以使用 Oleg 的技巧来做到这一点,它甚至有自己的库 on hackage
通过严重滥用类型类系统,可以生成一个fundep

class TypeEq a b result | a b -> result
这样TypeEq a b True仅当 a~b , 和 TypeEq a b False否则
所以你可以写
instance (TypeEq () a False) => T a
我认为这应该可行。我应该清楚,这种类型的相等性测试在实现方式上是纯粹的邪恶,但它确实有效。如果您想了解它是如何工作/概括它的,请查看该库的代码(另请阅读 HList 论文)。
如果完全有可能在没有负面约束的情况下做你想做的事,那就去做吧。

关于haskell - 为除一种特定类型之外的所有类生成一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949236/

相关文章:

haskell - 如何正确使用 >>= 替换这段代码中的 do 和 <- ?

haskell - 如何将文件加载到ghci

haskell - ghci:模块重新加载后将定义的值保留在范围内

haskell - corecursion 和 codata

scala - 召唤辅助以获得更高种类的类型,而不引用原始类型

haskell - 在 Haskell 中处理涉及 CmpNat 和单例的证明

haskell - 如何输入简单类型的 lambda 演算项 (S K K)

scala - 未强制执行方法的类型边界

scala - 任意函数 - 根据输入生成返回类型

scala - 在 Scala 中,是否可以 "curry"类型的 def 参数?