haskell - 您可以编写一个类型函数来反转约束吗?

标签 haskell data-kinds constraint-kinds

是否有可能编写一个类型函数,使其具有Show之类的约束,并返回将RHS约束为非Show实例的类型的函数?

签名就像

type family Invert (c :: * -> Constraint) :: * -> Constraint

最佳答案

不可以。这是该语言的设计原则,绝对不允许您这样做。规则是,如果程序有效,则添加更多instance不应破坏该程序。这是开放世界的假设。您需要的约束是非常直接的违反:

data A = A
f :: Invert Show a => a -> [a]
f x = [x]
test :: [A]
test = f A


可以,但是要添加

instance Show A


会破坏它。因此,原始程序最初不应该是有效的,因此Invert不存在。

关于haskell - 您可以编写一个类型函数来反转约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57350983/

相关文章:

haskell - 有没有办法在 Haskell 中将多态函数应用于具有不同参数类型的多个对象?

haskell - 使用 DataKinds - 种类不匹配错误

haskell - 我必须每次都施放 Nat-kinds 吗?

haskell - 使用具有 'limited' 约束的约束种类和类型族

haskell - 为什么 Haskell 中没有 Seq 的 head 函数

c - Langford 序列实现 Haskell 或 C

haskell - 约束元组的可键入实例

haskell - foldr 中的累加器

haskell - 在Haskell的-XDataKinds中使用列表类型