Haskell中的完整加法器



haskell newbie在这里。我需要为完整加法器编写功能时提供一些帮助。我有以下内容:

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

函数的返回类型是元组。确实:

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

现在(++) :: [a] -> [a] -> [a] condenates 列表。因此,这绝对不起作用来建造元组。因此,我们解决的第一个错误是:

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)

这是 output crandle tuple的正确结果。

相关内容

  • 没有找到相关文章

最新更新