簡體   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