繁体   English   中英

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

[英]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.BitsBits类。

所以你会得到:

-- 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM