haskell - 如何将两种类型约束与逻辑或 Haskell 结合起来?

标签 haskell typeclass type-constraints

在 Haskell 中,我们能够将类型的约束与逻辑与结合起来。

考虑以下

type And (a :: Constraint) b = (a, b)

或更复杂的
class (a, b) => And a b
instance (a, b) => And a b

我想知道如何在 Haskell 中逻辑地或两个约束在一起。

我最接近的尝试是这个,但它并不完全奏效。在这次尝试中,我用标签来具体化类型约束,而不是用隐式参数去具体化它们。
data ROr a b where
 L :: a => ROr a b
 R :: b => ROr a b

type Or a b = (?choose :: ROr a b)

y :: Or (a ~ Integer) (Bool ~ Integer) => a
y = case ?choose of
 L -> 4

x :: Integer
x = let ?choose = L in y

它几乎可以工作,但用户必须应用最后一部分,编译器应该为我做这件事。同样,当两个约束都满足时,这种情况不会让人们选择第三种选择。

我怎样才能在逻辑上或两个约束在一起?

最佳答案

我相信没有办法自动选择ROr a b ;如果,例如,它将违反开放世界假设b很满意,但后来a也很满意;任何冲突解决规则都必然会导致添加一个实例来改变现有代码的行为。

即采摘Rb满意但a不违反开放世界假设,因为它涉及确定实例不满足;1 即使您添加了“都满足”构造函数,您也可以使用它来确定实例是否不存在(通过查看是否你会得到 LR )。

因此,我不相信这样的或约束是可能的;如果你能观察到你得到了哪个实例,那么你可以通过添加一个实例来创建一个行为改变的程序,如果你不能观察到你得到了哪个实例,那么它就没什么用了。

1 这和正常的实例解析(也可能失败)之间的区别在于,通常编译器无法决定是否满足约束;在这里,您要求编译器确定不能满足约束。一个微妙但重要的区别。

关于haskell - 如何将两种类型约束与逻辑或 Haskell 结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10255148/

相关文章:

haskell - 在 Haskell 中,我如何将一个 Free monad 嵌入到另一个 Free monad 中?

haskell - 是否存在使用代数数据类型或多态性的 OOP 抽象类的 Haskell 等效项?

scala - 左和右类型相同的任何一种的标准特化

scala - 具有隐式转换的类型类中的堆栈溢出

scala - 如何获取与上下文绑定(bind)关联的类型类的实例?

arrays - 要求数组是 Swift 协议(protocol)中的最小大小

scala - 从连词中提取约束

swift - 如何为可添加参数创建通用函数?

haskell - 映射与过滤无限列表?

不使用 if-else 语句的 haskell 矩阵幂