From 57b468af75a0cac9f1ead856751eae6a1aaa69da Mon Sep 17 00:00:00 2001 From: Ivaylo Ivanov Date: Thu, 4 Nov 2021 19:21:05 +0100 Subject: [PATCH] Simplify checks in UE3 A.3 and A.4 --- code/Angabe3.lhs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/code/Angabe3.lhs b/code/Angabe3.lhs index 9839429..6f8e88d 100644 --- a/code/Angabe3.lhs +++ b/code/Angabe3.lhs @@ -64,13 +64,15 @@ Solution: Aufgabe A.3 +Solution: + * if one of the parameters is an empty matrix or an incorrect matrix, return undefined + * otherwise, check the per-element equality in both martices + > instance Eq Matrix where > (==) (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) @@ -92,38 +94,42 @@ Aufgabe A.4 > 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 (zipWith (zipWith (+)) m1 m2) > 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 (zipWith (zipWith (-)) m1 m2) > 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 (map (map ((-1)*)) m1) > absolute :: Matrix -> Matrix > absolute (M m1) -> | isEmpty (M m1)= fehlerwert > | matrixtyp (M m1) == KeineMatrix = fehlerwert > | otherwise = M (map (map (abs)) m1) > sign :: Matrix -> Matrix > sign (M m1) -> | isEmpty (M m1)= error "Vorzeichenfunktion undefiniert" > | matrixtyp (M m1) == KeineMatrix = error "Vorzeichenfunktion undefiniert" -> | otherwise = M ([[0]]) +> | [True] `elem` negative && [False] `elem` negative = error "Vorzeichenfunktion undefiniert" +> | [True] `elem` positive && [False] `elem` positive = error "Vorzeichenfunktion undefiniert" +> | [True] `elem` nulls && [False] `elem` nulls = error "Vorzeichenfunktion undefiniert" +> | [True] `elem` nulls = M([[0]]) +> | [True] `elem` positive = M([[1]]) +> | [True] `elem` negative = M([[-1]]) +> | otherwise = error "Vorzeichenfunktion undefiniert" +> where +> negative = map (map (<0)) m1 +> nulls = map (map (==0)) m1 +> positive = map (map (>0)) m1