From 32f7a83d2d0534ce908b0e8e05dc02889c637c6c Mon Sep 17 00:00:00 2001 From: Ivaylo Ivanov Date: Thu, 4 Nov 2021 17:47:01 +0100 Subject: [PATCH] Add basic checks for UE3 A.4, fix UE3 A.3 --- code/Angabe3.lhs | 70 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/code/Angabe3.lhs b/code/Angabe3.lhs index 4151041..c9a1d90 100644 --- a/code/Angabe3.lhs +++ b/code/Angabe3.lhs @@ -29,7 +29,7 @@ Solution: > matrixToString :: Matrix -> String -> String > matrixToString matrix res -> | matrix == fehlerwert = "()" +> | isEmpty matrix = "()" > | length m /= 0 && null ms = res ++ show m ++ ")" > | otherwise = matrixToString restMatrix (res ++ show m ++ " ") > where @@ -45,13 +45,14 @@ Solution: > matrixtyp :: Matrix -> Matrixtyp > matrixtyp m -> | m == fehlerwert = KeineMatrix +> | isEmpty m = KeineMatrix > | isCorrectMatrix m 0 == False = KeineMatrix > | otherwise = getMatrixType m > isCorrectMatrix :: Matrix -> Int -> Bool > isCorrectMatrix matrix n -> | matrix == fehlerwert = True +> | isEmpty matrix = True +> | n == 0 && length m == 0 = False > | n == 0 && length m /= 0 = isCorrectMatrix matrix (length m) > | n == length m = isCorrectMatrix (M ms) n > | otherwise = False @@ -64,14 +65,65 @@ Solution: Aufgabe A.3 > instance Eq Matrix where -> (==) (M m1) (M m2) = (m1 Prelude.== m2) -> (/=) (M m1) (M m2) = (m1 Prelude./= m2) +> (==) (M m1) (M m2) +> | m1 Prelude.== [] || m2 Prelude.== [] = error "Gleichheit undefiniert" +> | matrixtyp (M m1) == KeineMatrix || matrixtyp (M m2) == KeineMatrix = error "Gleichheit undefiniert" +> | otherwise = (m1 Prelude.== m2) +> (/=) (M m1) (M m2) +> | m1 Prelude.== [] || m2 Prelude.== [] = error "Ungleichheit undefiniert" +> | matrixtyp (M m1) == KeineMatrix || matrixtyp (M m2) == KeineMatrix = error "Ungleichheit undefiniert" +> | otherwise = (m1 Prelude./= m2) + +> isEmpty :: Matrix -> Bool +> isEmpty (M m) +> | null m = True +> | otherwise = False Aufgabe A.4 -Knapp, aber gut nachvollziebar geht die Instanzdeklaration fuer Num folgendermassen vor: -... +> instance Num Matrix where +> (+) m1 m2 = (add m1 m2) +> (-) m1 m2 = (diff m1 m2) +> (*) m1 m2 = (mult m1 m2) +> negate m = negation m +> abs m = absolute m +> signum m = sign m +> fromInteger z = (M [[fromIntegral z]]) +> add :: Matrix -> Matrix -> Matrix +> add (M m1) (M m2) +> | isEmpty (M m1) || isEmpty (M m2) = fehlerwert +> | matrixtyp (M m1) == KeineMatrix || matrixtyp (M m2) == KeineMatrix = fehlerwert +> | matrixtyp (M m1) /= matrixtyp (M m2) = fehlerwert +> | otherwise = M ([[0]]) -instance Num Matrix where - ... +> diff :: Matrix -> Matrix -> Matrix +> diff (M m1) (M m2) +> | isEmpty (M m1) || isEmpty (M m2) = fehlerwert +> | matrixtyp (M m1) == KeineMatrix || matrixtyp (M m2) == KeineMatrix = fehlerwert +> | matrixtyp (M m1) /= matrixtyp (M m2) = fehlerwert +> | otherwise = M ([[0]]) + +> mult :: Matrix -> Matrix -> Matrix +> mult (M m1) (M m2) +> | isEmpty (M m1) || isEmpty (M m2) = fehlerwert +> | matrixtyp (M m1) == KeineMatrix || matrixtyp (M m2) == KeineMatrix = fehlerwert +> | otherwise = M ([[0]]) + +> negation :: Matrix -> Matrix +> negation (M m1) +> | isEmpty (M m1)= fehlerwert +> | matrixtyp (M m1) == KeineMatrix = fehlerwert +> | otherwise = M ([[0]]) + +> absolute :: Matrix -> Matrix +> absolute (M m1) +> | isEmpty (M m1)= fehlerwert +> | matrixtyp (M m1) == KeineMatrix = fehlerwert +> | otherwise = M ([[0]]) + +> sign :: Matrix -> Matrix +> sign (M m1) +> | isEmpty (M m1)= fehlerwert +> | matrixtyp (M m1) == KeineMatrix = fehlerwert +> | otherwise = M ([[0]])