[英]Is there a typeclass in haskell for boolean values?
我试图通过查看2006年链接上comonad应用程序的精彩短篇和教育性文章来学习一些Haskell,它包含一个类似rule (U (a:_) b (c:_)) = not (a && b && not c || (a==b))
的表达式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)和其他。
如果有一个名为truthy
类型类,我想我可以写rule :: (Truthy t) => U t -> Bool
。 由于我想迭代rule
,第一种类型的注释( rule :: U Bool -> Bool
)已经足够好了,但问题仍然困扰着我的大脑。
有没有这样的类型类? 如果有,它叫什么? 如果没有,为什么没有必要呢?
Digression:通常我们不使用类型类来做你可能称之为重载的东西 ,你在动态语言中找到的那种(例如,使用+
表示“连接列表”或“添加整数”,或者重载布尔操作来处理“真实的“你问题中的价值观”。 不同之处在于我猜我们说好的抽象是使用类型类进行的,这些类具有一组将它们组合在一起的定律,因此您可以编写有用的多态代码。 可能我们可以通过这个标准创建一个“truthy”类,但我不确定。
但是为了得到你的问题,肯定有一些类在某种程度上抽象布尔逻辑(这里的研究领域可能是布尔代数 ),这里最相关的可能是来自Data.Bits
的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))
上面唯一棘手的一点是a == b
成为罗嗦的更通用的形式complement (a ``xor`` b)
。 实际上,如果我们将自己局限于基本操作(AND / OR / NOT),则==
的更一般形式非常复杂:
a .==. b = complement ((a .|. b) .&. complement (a .&. b))
用这种更通用的类型(我不知道它的意思是什么)来看这个操作是否或以何种方式有意义将会很有趣,例如它是否对Int
做了一些合理的事情。 然后将它与Int
进行比较,我们使用了你的“truthy”类。 比另一个更有用吗? Bits
版本是否为您提供了对算法的任何新见解,还是只是一个任意的重载?
编辑 :这是一个有趣的工作在这个更抽象的领域:我们可以使用布尔代数的定律来更好地减少和理解我们的表达。 例如,通过将其交给Wolfram Alpha,我们可以观察到表达式的规范化形式根本不包含c
(你应该仔细检查我没有在某个地方犯过错误),所以我们不妨写一下:
rule (U (a:_) b _) = (a && not b) || (not a && b)
这可能是有趣的见解(是c
甚至在我们的数据结构有必要吗?)或者可能表明在我们的逻辑错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.