Ich hatte eine ähnliche Situation mit Point
Typ. Aber ich dachte nicht über Einschränkungen nach, ich dachte darüber nach, wie ich den Elementtyp meines Punktes verallgemeinern könnte. Dann habe ich verstanden, wenn ich Punkttyp wie diesen data Point a = Point a a
habe, dann kann ich es Instanz von Functor, Applicative, Foldable und Traversable tun. Und ich kann Funktion nach Standart allgemeiner Art entwerfen. Zum Beispiel:
dist :: Floating a => Point a -> Point a -> a
dist a b = sqrt $ sum $ (^2) <$> ((-) <$> a <*> b)
Und ich hatte Frage. Was ist los? :) Wenn ich Constraint hinzufüge (wie Sie gefragt haben), würde ich auf diese Weise nicht entwerfen können und ich würde viele Funktionen wie pointSub
implementieren müssen.
Also, es gibt etwas zu denken :)
Dies ist möglich, aber ist fast nie das, was Sie tun sollten. Im Allgemeinen ist es viel besser, die Bedingung "Num s" nur auf die Funktionen zu setzen, die sie tatsächlich benötigen. – Alec
Alec, alle meine Funktionen mit der Skala benötigen die num-Bedingung. –
@AviCaspe Es gibt sehr gute Gründe, dies nicht zu tun. Die Antwort enthält eine, aber es gibt andere. Sie sollten wirklich darüber nachdenken, die Einschränkungen genau dort zu platzieren, wo sie benötigt werden. – Carl