haskell中是否有类型类用于布尔值?

Lud*_*igH 4 haskell typeclass

我想通过看,从2006年comonad应用高超的短期和教育的文章,学习一些Haskell的链接,它包含了像一个表达rule (U (a:_) b (c:_)) = not (a && b && not c || (a==b))whre U是拉链comonad.这data U x = [x] x [x]在comonad操作的实现中得到了说明.

试图了解更多,我试图手动注释表达式的类型.一个明智的选择似乎是rule :: U Bool -> Bool,但这似乎有点......限制性.我可以想象其他类型能够具有真实性值,例如Ints(0对应于false,所有其他值可以是True)和其他.

如果有一个类型类称为truthyness truthy,我想我可以写rule :: (Truthy t) => U t -> Bool.因为我想迭代rule,第一种类型的注释(rule :: U Bool -> Bool)已经足够好了,但问题仍然困扰着我的大脑.

有没有这样的类型类?如果有,它叫什么?如果没有,为什么没有必要呢?

jbe*_*man 6

Digression:通常我们不使用类型类来执行你可能称之为重载的东西,你在动态语言中找到的类型(例如,使用+"连接列表"或"添加整数",或者重载布尔操作以处理"truthy" "你问题中的价值观".不同之处在于我猜我们说好的抽象是使用类型类进行的,这些类具有一组将它们组合在一起的定律,因此您可以编写有用的多态代码.可能我们可以通过这个标准创建一个"truthy"类,但我不确定.

但是为了得到你的问题,肯定有一些类在某种程度上抽象布尔逻辑(这里的研究领域可能是布尔代数),这里最相关的可能就是BitsData.Bits.

所以你会得到:

-- note, the polymorphic `t` has cooties, and we'd need to be able to
-- make the caller polymorphic in a sensible way too for this to make sense
rule :: (Bits t) => U t -> t
rule (U (a:_) b (c:_)) = complement (a .&. b .&. complement c .|. complement (a `xor` b))
Run Code Online (Sandbox Code Playgroud)

上面唯一棘手的问题就是a == b变得更加笼统complement (a ``xor`` b).实际上,如果我们将自己局限于基本操作(AND/OR/NOT),那么更一般的形式==是非常复杂的:

a .==. b = complement ((a .|. b) .&. complement (a .&. b))
Run Code Online (Sandbox Code Playgroud)

有趣的是看这个操作是否或以何种方式使用这种更通用的类型(我不知道它的意图是什么),例如它是否做了明智的事情Int.然后将它与Int我们使用你的"truthy"类进行比较.比另一个更有用吗?该Bits版本是否为您提供了对算法的任何新见解,还是只是一个任意的重载?

编辑:这是一个有趣的工作在这个更抽象的领域:我们可以使用布尔代数的定律来更好地减少和理解我们的表达.例如通过交给受Wolfram Alpha的,我们可以观察到,我们表达的归一化形式并不包含c在所有的(你应该仔细检查我没有弄错的地方),所以我们还不如写的:

rule (U (a:_) b _) = (a && not b) || (not a && b)
Run Code Online (Sandbox Code Playgroud)

这可能是有趣的见解(c在我们的数据结构中甚至是必要的吗?)或者可能表明我们的逻辑中存在错误.