2017-05-03 5 views
3

ハスケル初心者はこちら。私は完全な加算のための関数を書くためにいくつかの助けが必要です。 私は、次の持っている: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

しかし、あなたの関数は2つの要素を返しませんか? –

+0

私はあなたが '\' xor \ ''(それを中置にするのに必要なバッククォート)を探しているかもしれないと思います。今では 'xor'と' b'の2つの引数に 'a'を適用しています。 – ryachza

+2

現在、関数全体を実装して、それが失敗する理由をデバッグしようとしています。あなたが小さいものから始めるならば、自分でもっと楽にすることができます。たとえば、 'fulladder a b c = True ++ True'は、最初のダミー実装として良いでしょう。失敗しますが、検索するのがずっと短くて簡単です。これを修正したら、完全な表現に達するまで 'fulladder a b c =(True xまたは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 ^      ^

次に、関数の後ろに引数を指定します。だから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) 
出力ための正しい結果である

を運びますタプル。

関連する問題