/ / Ist es möglich, "isa" / "match" -Funktion zu schreiben - haskell

Ist es möglich, "isa" / "match" -Funktion zu schreiben - haskell

Ist es möglich, "isa" oder "match" -Funktion zu schreibenauf Haskell ohne TH? Es muss Konstruktor und Werte abrufen und Wert mit diesem Konstruktor vergleichen, aber Konstruktor kann mehrere Argumente haben. Beispiel:

data X = X a b|Y {age::Int, name::String}
isa c v = ???
goal_of_exercise x y|iff all (isa X) x y = 1
|iff any (isa Y) x y = 2
where iff agg c a b = agg c [a, b]

Oder gibt es eine andere Lösung des Übungsziels ...?

Antworten:

4 für die Antwort № 1

Die Funktion, nach der Sie fragen, ist nicht nur unmöglich zu schreiben - sie ist im Zusammenhang mit Haskell absolut unsinnig.

In Haskell sind alle (die meisten) Datentypen in der Tat, wie Sie gesehen haben, mit Unions versehen, die Typinformationen zur Laufzeit tragen. Dies ermöglicht, dass der Mustervergleich funktioniert:

data D = A | B

whichD :: D -> String
whichD A = "it"s an A"
whichD B = "it"s a B"

Dies funktioniert für Konstrukteure von ein bestimmter Typobwohl. Die Unterschrift von whichD speziell sagt es dauert ein D, die mit einem ihrer Konstruktoren konstruiert werden kann. Wenn Sie es erweitern wollten, sagen wir, analog D", könnten Sie eine Summenart dafür verwenden:

data OneOf = OneD D | OneD" D"

Nun, es gibt Fälle, wo dies nicht der Fall ist, nämlich parametrisierte Kontexte:

specialShow :: Show a => a -> String
specialShow a = "it"s a special " ++ show a

So, jetzt ist es möglich, das Verhalten von zu ändern specialShow für etwas Besonderes as? Ja im Prinzip, aber nicht unter dieser Unterschrift. In der Regel führen Sie eine eigene Typklasse ein und stellen bestimmte Instanzen für die gewünschten Typen bereit. Für alle anderen Typen, die Sie einfügen möchten, verwenden Sie generischen Code. Dies kann bei überlappenden Instanzen zu Problemen führen, ist aber lösbar.


Was wenn du beharrte auf die Laufzeitprüfung zu tun? Ich denke nicht, dass das sogar in allen Fällen funktionieren würde, aber möglicherweise unter Verwendung einiger Compiler-Intrinsics könnte man sie zwingen, mehr über den tatsächlichen Wert zu erzählen. Ich bin mir ziemlich sicher, dass es keinen Standard-Haskell-Weg gibt, dies zu tun, da es im Wesentlichen die Typ-System-Abstraktion unterbricht.