www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Lotsche

Gepostet:
10.06.2012 14:46

2 binäre Listen in Instance addieren (Überlauf)  
Hallo, ich möchte ein Programm in Haskell schreiben, dass 2 Listen mit Binärzahlen berechnet. Dazu soll es entweder 1,0 oder True, False bekommen (beide Fälle jeweils in einer Instance). Die Listen werden bereits so eingegeben, dass das niedrigste Bit vorne steht und anschließend berechnet wird.


Mein Problem: Wie sieht die Funktion aus, um den Überlauf zu berücksichtigen.

Hier mein bisheriger Code:


class Dual a where
xadd :: [a]->[a]->[a]



instance Dual Bool where

xs = let ns :: [a]
ns=reverse xs
in ns++ns

--xadd [a] [] = []
--xadd [] [a] = []
--xadd [a]
-- | (a==True) && (b==True) = [False]
-- | (a==True) && (b==False) = [True]
-- | (a==False) && (b==True) = [True]
-- | (a==False) && (b==False) = [False]

xadd (x:xs) (y:ys)
| (x==True) && (y==True) = [False] ++ xadd xs ys
| (x==True) && (y==False) = [True] ++ xadd xs ys
| (x==False) && (y==True) = [True] ++ xadd xs ys
| (x==False) && (y==False) = [False] ++ xadd xs ys

instance Dual Char where
xadd [] [] = []
xadd [a] [] = []
xadd [] [a] = []
xadd [a] [b]
| (a==\'1\') && (b==\'1\') = [\'0\']
| (a==\'1\') && (b==\'0\') = [\'1\']
| (a==\'0\') && (b==\'1\') = [\'1\']
| (a==\'0\') && (b==\'0\') = [\'0\']

xadd (x:xs) (y:ys)
| (x==\'1\') && (y==\'1\') = [\'0\'] ++ xadd xs ys
| (x==\'1\') && (y==\'0\') = [\'1\'] ++ xadd xs ys
| (x==\'0\') && (y==\'1\') = [\'1\'] ++ xadd xs ys
| (x==\'0\') && (y==\'0\') = [\'0\'] ++ xadd xs ys



EDIT: Die Schrägstriche sollen im Code nicht sein ...er setzt die aber immer wieder.
Zum Seitenanfang    
 
Landei

Gepostet:
11.06.2012 13:43

   
Dein xadd braucht den Übertrag als einen zusätzlichen Parameter, also:


xadd [] [] \'0\' = []
xadd [\'0\'] [\'0\'] \'0\' = []
xadd as [] c = xadd as [\'0\'] c
xadd [] bs c = xadd [\'0\'] bs c
xadd (a:as) (b:bs) c = sadd a b c : xadd as bs (carry a b c)

--addiert eine Stelle (ohne Übertrag)
sadd \'0\' \'0\' \'0\' = \'0\'
sadd \'1\' \'1\' \'0\' = \'0\'
sadd \'1\' \'0\' \'1\' = \'0\'
sadd \'0\' \'1\' \'1\' = \'0\'
sadd a b c = \'1\'

--berechnet den Übertrag
carry \'1\' \'1\' \'0\' = \'1\'
carry \'1\' \'0\' \'1\' = \'1\'
carry \'0\' \'1\' \'1\' = \'1\'
carry \'1\' \'1\' \'1\' = \'1\'
carry a b c = \'0\'


xadd \"1101\" \"111\" \'0\' gibt dann \"01001\", also 11 + 7 = 18. Natürlich sind alles Zahlen \"rückwärts\" (was man mit reverse ändern könnte). Als initialen Übertrag muss man natürlich \'0\' angeben.
Zum Seitenanfang