This repository has been archived on 2021-11-27. You can view files and clone it, but cannot push or open issues or pull requests.
fprog2021WS/code/Angabe6.hs

106 lines
3.1 KiB
Haskell

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 -> Zeile -> [Row] -> [Row]
construct_matrix m rc res
| m == fehler = []
| rc > numrow = res
| otherwise =
construct_matrix m (rc + 1) (res ++ [(construct_row f numcol rc 1 [])])
where
numcol = snd (mtyp m)
numrow = fst (mtyp m)
f = mf m
construct_row :: Matrixfkt -> Spaltenzahl -> Zeile -> Spalte -> Row -> Row
construct_row f numcol rc cc res
| cc > numcol = 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:
...
-}