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