haskell中的全加器

时间:2017-05-03 17:03:30

标签: haskell boolean-logic

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)'

1 个答案:

答案 0 :(得分:8)

您的函数的返回类型是元组。事实上:

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(或使用背景)。所以我们应该把它重写为:

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)

输出携带元组的正确结果。