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的正确结果。