簡體   English   中英

Haskell 中的二進制數相加

[英]Addition of Binary Numbers in Haskell

我需要創建一個 function 將二進制數添加到另一個二進制數。 這是我的學習任務,我不太喜歡 Haskell 並且可以使用一些幫助。

我已經制作了我必須使用的數據類型。

data B = Zero
    | Even B
    | Odd B
    deriving (Show, Generic)
instance Listable B where tiers = genericTiers

Even表示 0, Odd表示 1, Zero表示結束。

..所以例如 Odd(Even(Odd Zero))) 等於 101 ......到目前為止,這就是我的 function。

plusB :: B -> B -> B
plusB (Odd a) (Odd b) = Odd (Even (plusB a b))
plusB (Even a) (Even b) =  Even (plusB a b)
plusB (Even a) (Odd b) = Odd (plusB a b)
plusB (Odd a) (Even b) = Odd (plusB a b)
plusB (Zero) (Zero) = .....

我認為我必須使用遞歸才能工作。

我希望這是有道理的。

如果假設Even構造函數返回偶數的圖像,而Odd構造函數返回奇數的圖像,這意味着最外面的構造函數映射到最右邊(最低有效位)位。

在這種情況下,對OddEven更具描述性的名稱可能是TwiceTwicePlus1

將 B 對象映射到整數:

toIntegerFromB :: B -> Integer
toIntegerFromB  Zero    =  0
toIntegerFromB (Even x) =  2*(toIntegerFromB x)
toIntegerFromB (Odd x)  =  1 + 2*(toIntegerFromB x)

至於添加兩個B對象:

plusB :: B -> B -> B

我們有 3*3 = 9 個方程要寫。 但其中有 5 個涉及中性元素Zero ,因此很容易編寫:

plusB  (Zero)    (Zero)     =  Zero
plusB  (Zero)    (Even a)   =  Even a
plusB  (Even a)  (Zero)     =  Even a
plusB  (Zero)    (Odd a)    =  Odd a
plusB  (Odd a)   (Zero)     =  Odd a

關於剩下的 4 個等式,我們注意到數字 1 映射到Odd Zero ,而數字 2 映射到Even (Odd Zero)

OddEven分別視為TwicePlus1Twice

(奇數 a) + (奇數 b) ≃ (2 a+1)+(2 b+1) = 2 + 2*(a+b) ≃ 偶數 (奇零) + 偶數 (a+b)

因此等式:

plusB  (Odd a)   (Odd b)    =  plusB  (Even (Odd Zero))  (Even (plusB a b))

接下來,我們有:

(奇數 a) + (偶數 b) ≃ (2 a + 1) + (2 b) = 1 + 2*(a+b) ≃ 奇數 (a+b)

因此,使用對稱性,兩個方程:

plusB  (Even a)  (Odd b)    =  Odd  (plusB a b)
plusB  (Odd a)   (Even b)   =  Odd  (plusB a b)

最后剩下的等式更簡單:

(偶數 a) + (偶數 b) ≃ (2 a)+(2 b) = 2*(a+b) ≃ 偶數 (a+b)

plusB  (Even a)  (Even b)   =  Even (plusB a b)

把它們放在一起:

plusB :: B -> B -> B
plusB  (Zero)    (Zero)     =  Zero
plusB  (Zero)    (Even a)   =  Even a
plusB  (Even a)  (Zero)     =  Even a
plusB  (Zero)    (Odd a)    =  Odd a
plusB  (Odd a)   (Zero)     =  Odd a
plusB  (Odd a)   (Odd b)    =  plusB  (Even (Odd Zero))  (Even (plusB a b))
plusB  (Even a)  (Even b)   =  Even (plusB a b)
plusB  (Even a)  (Odd b)    =  Odd  (plusB a b)
plusB  (Odd a)   (Even b)   =  Odd  (plusB a b)

與更常見的data Nat = Zero | Succ Nat data Nat = Zero | Succ Nat ,這種表示的優點是只需要 O(log(n)) 嵌套構造函數,而不是 O(n)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM