Integer-Tupel vergleichen



  • Schreiben Sie eine Funktion similarPair, die Integerpaare vergleicht. Das Ergebnis ist True, falls beide Paare dieselben Werte enthalten, aber nicht unbedingt in der korrekten Reihenfolge, etwa:
    similarPair (3 ,4) (4 ,3) == True
    similarPair (3 ,4) (3 ,5) == False
    Der Typ ist
    similarPair :: (Int , Int) → (Int , Int) → Bool

    Bonuspunkte: Nochmals 3 P gibt es für die schönste, am besten lesbare und verständliche Implementierung. Überlegt euch, was diese Funktion eigentlich machen soll und bringt genau das zum Ausdruck.

    Eine Implementierung dieser Fuktion ist für mich kein Problem, aber wie ist das mit den Bonuspunkten zu verstehen?

    Wie könnte eine BESONDERS schöne Implementierung aussehen?

    Sortieren und auf Gleichheit testen?



  • shisha schrieb:

    schönste, am besten lesbare und verständliche Implementierung. Überlegt euch, was diese Funktion eigentlich machen soll und bringt genau das zum Ausdruck.

    Der Wortwahl nach würde ich auf den Wunsch einer guten Dokumentation schließen. Gib sinnvolle Variablennamen, kommentiere deine Schritte, gib eine Funktionsbeschreibung mit Parameter & Rückgabe Erklärung (wie es Dokumentationsgeneratoren, wie Doxygen, lesen können), vermeide Redundanz, usw.



  • Die Aufgabe ist viel zu einfach als dass man da gross Möglichkeit hätte, das aufzupeppen. Hier mal ein paar Versionen:

    similarPair t (x,y) = t==(x,y) || t==(y,x)
    similarPair t (a,b)
      | t==(a,b)  = True
      | t==(b,a)  = True
      | otherwise = False
    similarPair (a,b) (c,d) = a`elem`[c,d] && b`elem`[c,d]
    similarPair (a,b) (c,d) = S.fromList [a,b] == S.fromList [c,d]
    similarPair (a,b) (c,d) = sort [a,b] == sort [c,d]
    similarPair = curry (uncurry (==) . l2t . map (sort . t2l) . t2l)
      where l2t [a,b] = (a,b)
            t2l (a,b) = [a,b]
    similarPair a b = (2==) . length . group . (map uncurry [min,max] <*>) . flip (:) . (:[])
    similarPair = curry $ (2==) . length . group . (map uncurry [min,max] <*>) . uncurry (flip (:) . (:[]))
    

    Ich empfehle die letzte Version, absolut pointfree.



  • Vielleicht: in der Kürze liegt die Würze + selbstkommentierender Code (was hat der Prof selbst dazu erklärt?).
    Eine korrekte Signatur ist schon mal gut.
    Schon mal über "Patternmatching", Platzhalter und Wildcards nachgedacht?
    (und vielleicht auch über die Auswertungs-Reihenfolge von verketteten Sonderzeichenkombinierungen)
    (Ansatz wäre vielleicht eine Art Wertetabelle a la
    f x = ...)

    Außerdem hast du noch die nette Möglichkeit, das lhs - Format zu benutzen.



  • Nur durch pattern matching, sowas wie:

    similarPair (a,b) (a,b) = True
    similarPair (a,b) (b,a) = True
    similarPair _      _    = False
    

    kA ob 's funktioniert.


Log in to reply