好了,所以我有这样的代码在Haskell:解读ADDC代码并进行
data Bigit = O | I deriving (Show,Eq)
add x y = reverse $ addC O (reverse x) (reverse y)
addC O [] [] = []
addC I [] [] = [I]
addC carry [] r = addC carry [O] r
addC carry l [] = addC carry l [O]
addC carry (left:leftOver) (right:rightOver) = sumBigit :(addC newCarry leftOver
rightOver)
where
(sumBigit,newCarry)
= case (left,right,left) of
(O,O,O) -> (O,O)
(O,I,O) -> (I,O)
(I,O,O) -> (I,O)
(I,I,O) -> (O,I)
(O,O,I) -> (I,O)
(O,I,I) -> (O,I)
(I,O,I) -> (O,I)
(I,I,I) -> (I,I)
,我需要弄清楚是什么意思。到目前为止,我知道它使用bigits和bigits列表作为类型,而bigit不是我(代表1)和O(代表0)。
我想通了,类型签名添加和ADDC:
add :: [Bigit] -> [Bigit] -> [Bigit]
addC :: Bigit -> [Bigit] -> [Bigit] -> [Bigit]
为了帮助我明白了,我已经加载的代码放到GHCI,我一直玩了。例如,我知道,如果我告诉它:
add [I,O] [I,O]
它给了我[I,I,O],因为它遵循:
reverse (addC O (reverse x) (reverse y))
reverse (addC O [O,I] [O,I])
但是,从这里,我很困惑如何去搞清楚addC
部分。我有正确的论点:一个Bigit和两个Bigits列表。但是,我不明白用什么模式来匹配这个。我很困惑“携带”是什么意思。 任何人都可以尝试和帮助吗?
顺便说一句,这段代码写得相当不错。你通常会为此使用'foldr'。 – fuz
'addC'函数实现了一个波纹进位加法器,case语句只是一个完整的加法器。你需要学习二进制算术来理解代码,一旦你做了它几乎微不足道。 – augustss
哦,代码是错误的。案件陈述中的一个“左”应该是“carry”。哪一个并不重要。 – augustss