[英]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
構造函數返回奇數的圖像,這意味着最外面的構造函數映射到最右邊(最低有效位)位。
在這種情況下,對Odd
和Even
更具描述性的名稱可能是Twice
和TwicePlus1
。
將 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)
。
將Odd
和Even
分別視為TwicePlus1
和Twice
:
(奇數 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.