2017-05-03 25 views
3

Haskell新手在這裏。我需要一些幫助,爲全加器編寫一個函數。 我有以下幾點:Haskell的全加器

xor :: Bool -> Bool -> Bool 
xor True False = True 
xor False True = True 
xor _ _ = False 

fulladder :: Bool -> Bool -> Bool ->(Bool, Bool) 
fulladder a b c = c xor (a xor b) ++ (a&&b) || ((a xor b) && c)  

,我發現了以下錯誤:

* Couldn't match expected type `(Bool -> Bool -> Bool) 
            -> Bool -> Bool' 
        with actual type `Bool' 
    * The function `a' is applied to two arguments, 
     but its type `Bool' has none 
     In the first argument of `(&&)', namely `(a xor b)' 
     In the second argument of `(||)', namely `((a xor b) && c)' 
+0

但是你的函數不返回兩個元素? –

+0

我認爲你可能正在尋找'\'xor \''(使其成爲中綴所需的反引號)。因爲現在你正在對'xor'和'b'這兩個參數應用'a'。 – ryachza

+2

您目前實現了一個完整的功能,然後嘗試調試它失敗的原因。如果你從小處開始建設,你可以讓自己變得更容易。例如,'fulladder a b c = True ++ True'可能是一個很好的第一個虛擬實現:它失敗了,但它更短,更容易查找。一旦你解決了這個問題,你可以擴展到'ful = bc =(True xor True,True)',等等,直到你完全表達。 –

回答

7

你的函數的返回值類型是元組。事實上:

fulladder :: Bool -> Bool -> Bool -> (Bool, Bool) 
--         ^2-tuple

現在(++) :: [a] -> [a] -> [a]會連接名單。所以這絕對不會構建一個元組。所以我們解決的第一個錯誤是:

fulladder :: Bool -> Bool -> Bool ->(Bool, Bool) 
fulladder a b c = ( c xor (a xor b) , (a&&b) || ((a xor b) && c) ) 
--    ^tuple syntax ^      ^

接下來在Haskell中,指定一個函數,後面跟隨參數。所以c xor a將無法​​正常工作。你應該使用xor c a(或使用backtics)。所以,我們應該把它改寫爲:

fulladder :: Bool -> Bool -> Bool ->(Bool, Bool) 
fulladder a b c = (xor c (xor a b) , (a&&b) || ((xor a b) && c)) 
--     ^ ^right order   ^

或者:

fulladder :: Bool -> Bool -> Bool ->(Bool, Bool) 
fulladder a b c = (c `xor` (a `xor` b) , (a&&b) || ((a `xor` b) && c)) 
--     ^^^^backtics   ^ ^

現在函數生成:

*Main> fulladder False False False 
(False,False) 
*Main> fulladder False False True 
(True,False) 
*Main> fulladder False True False 
(True,False) 
*Main> fulladder False True True 
(False,True) 
*Main> fulladder True False False 
(True,False) 
*Main> fulladder True False True 
(False,True) 
*Main> fulladder True True False 
(False,True) 
*Main> fulladder True True True 
(True,True) 

這對輸出攜帶正確的結果元組。