module Angabe6 where {- 1. Vervollstaendigen Sie gemaess Angabentext! 2. Vervollständigen Sie auch die vorgegebenen Kommentaranfänge! 3. Loeschen Sie keine Deklarationen aus diesem Rahmenprogramm, auch nicht die Modulanweisug! 4. Achten Sie darauf, dass `Gruppe' Leserechte fuer Ihre Abgabedatei hat! 5. Ersetzen Sie die Trivialimplementierungen error "Nicht implementiert" durch sinnvolle Implementierungen, die die jeweilige Aufgabenstellung erfüllen. -} type Nat0 = Int type Nat1 = Int type Zeilenzahl = Nat1 type Spaltenzahl = Nat1 type Zeile = Nat1 type Spalte = Nat1 type Skalar = Int type Matrixtyp = (Zeilenzahl,Spaltenzahl) type Matrixfkt = Zeile -> Spalte -> Skalar -- ausschliessl. total def. Abb.! -- Matrizenwerte als Typ und funktionale Darstellung data MatrixF = Mf { mtyp :: Matrixtyp, mf :: Matrixfkt } -- Namesvereinbarung fuer den Fehlerwert fehler = Mf (0,0) (\_ _ -> 0) :: MatrixF -- helper functions type Row = [Skalar] construct_matrix :: MatrixF -> [Row] -> Zeile -> [Row] construct_matrix m res rc | m == fehler = [] | otherwise = construct_matrix m (res ++ [(construct_row f numcol rc 1 [])]) (rc+1) where numcol = snd (mtyp m) f = mf m construct_row :: Matrixfkt -> Spaltenzahl -> Zeile -> Spalte -> Row -> Row construct_row f numcol rc cc res | numcol == cc = res | otherwise = construct_row f numcol rc (cc+1) (res ++ [(f rc cc)]) is_correct_matrix :: MatrixF -> Bool is_correct_matrix m | m == fehler = False | fst t == height && snd t == width = True | otherwise = False where t = mtyp m mtx = construct_matrix m [] 1 height = length mtx width = length (head mtx) is_empty :: [Row] -> Bool is_empty m | null m = True | otherwise = False -- Aufgabe A.1 instance Show MatrixF where show (Mf t f) = matrix_to_string (construct_matrix (Mf t f) [] 1) "(" matrix_to_string :: [Row] -> String -> String matrix_to_string matrix res | is_empty matrix = "()" | length m /= 0 && null ms = res ++ show m ++ ")" | otherwise = matrix_to_string ms (res ++ show m ++ " ") where m:ms = matrix -- Aufgabe A.2 matrixtyp :: MatrixF -> Maybe Matrixtyp matrixtyp (Mf t f) | is_correct_matrix (Mf t f) == False = Nothing | otherwise = (Just (0,0)) -- Aufgabe A.4 instance Eq MatrixF where (Mf t1 f1) == (Mf t2 f2) | is_correct_matrix (Mf t1 f1) == False || is_correct_matrix (Mf t2 f2) = error "Gleichheit undefiniert" | otherwise = if show (Mf t1 f1) == show (Mf t2 f2) then True else False -- Aufgabe A.5 instance Num MatrixF where (Mf t1 f1) + (Mf t2 f2) = error "Nicht implementiert!" (Mf t1 f1) - (Mf t2 f2) = error "Nicht implementiert!" (Mf t1 f1) * (Mf t2 f2) = error "Nicht implementiert!" negate (Mf t f) = error "Nicht implementiert!" abs (Mf t f) = error "Nicht implementiert!" signum (Mf t f) = error "Nicht implementiert!" fromInteger n = error "Nicht implementiert!" {- Knapp, aber gut nachvollziehbar geht die Instanzbildung fuer Num folgendermassen vor: ... -}