Frage

Wie würden Sie die folgenden Signaturen in einfachem Englisch definieren:

Ord a => ...

Eq a => ...

Num a => ...

Könnten Sie die Bedeutung dieser beschreiben und mich wissen lassen, was die Unterschiede sind (wie ich es jemand anderem erklären würde)?

Vielen Dank.

War es hilfreich?

Lösung

Dies sind alles Beispiele für "Klassenbeschränkungen": Sie beschränken, welche Typen anstelle der ihnen folgenen Typvariablen verwendet werden können (sie folgen (a in diesem Fall) und verlangt, dass es zu einem bestimmten gehört Geben Sie Klasse ein. Ord, Eq und Num sind Beispiele für Typklassen.

  • Ord a => ... meint a ist ein Typ, der einen natürlichen Begriff der Ordnung hat, die damit verbunden sind. Zum Beispiel können Ganzzahlen natürlich von kleiner bis größer angeordnet werden. In mathematischer Hinsicht gibt es a Gesamtbestellung an a. Ein offensichtliches Beispiel einer Funktion, die diese Einschränkung erfordert, ist sort :: Ord a => [a] -> [a]; Lesen Sie diese Signatur, um das zu sagen sort funktioniert nur auf Listen der Dinge, die in Bezug aufeinander in Ordnung gebracht werden können.

  • Eq a => ... meint a ist ein Typ, dessen Mitglieder für einen Begriff der Gleichheit miteinander verglichen werden können. In mathematischer Hinsicht gibt es eine Äquivalenzbeziehung an a. Beachten Sie, dass dies eine Superklasse von ist Ord, was bedeutet, dass alles, was einen Begriff der Ordnung hat, auch einen Begriff der Äquivalenz haben muss. Ein Beispiel für eine Funktion, die diese Einschränkung erfordert, ist elem :: Eq a => a -> [a] -> Bool (was bestimmt, ob eine Liste ein bestimmtes Element enthält); Lesen Sie diese Signatur, um das zu sagen elem funktioniert nur auf Listen der Dinge, die für die Gleichheit miteinander verglichen werden können. Wenn Sie darüber nachdenken, wie Sie schreiben würden elem selbst, das sollte Sinn machen.

  • Num a => ... meint a ist ein numerischer Typ, was bedeutet, dass er einige grundlegende arithmetische Operationen unterstützt: +, *, -, abs. Ich glaube, das ähnelt ungefähr dem mathematischen Begriff von a Ring. Grundsätzlich gehören alle Typen, die Sie als "Zahltypen" betrachten, zu dieser Klasse: Int, Double, usw. Sie würden das sehen Num a => Einschränkung vor einer Signatur, wenn die Funktion so geschrieben wurde, generell mit jeder Art von Anzahl zu arbeiten. Zum Beispiel, sum :: Num a => [a] -> a, was alle Elemente einer Liste von Zahlen zusammenfasst, kann gleich gut funktionieren [Int], [Double], [Rational], etc ... alles, was es tun muss, ist, seinen Inhalt zu addieren, egal welche Art von Zahlen sie sind. Aber Zahlen müssen sie sein!

Grundsätzlich sind diese Typklassen/Einschränkungen ein Ansatz zur "prinzipiellen Überlastung" von Funktionen. Wir können benutzen (==) :: Eq a => a -> a -> Bool auf verschiedene Typen, aber Nicht irgendwelche Typen. Einige Dinge, zum Beispiel Funktionen, machen Sie nicht sinnvoll, um die Gleichheit zu vergleichen (vielleicht weil Gleichheit für diesen Typ nicht laugt) und es noch nie macht Sinn, zwei Dinge von zu vergleichen anders Typen für die Gleichheit (kontrastieren Sie dies mit Java, bei denen Sie zwei beliebige Objekte möglicherweise unterschiedlicher Typen für die Gleichheit vergleichen können).

Für weitere (sehr zugängliche) Lesen in Typklassen und Einschränkungen empfehle ich dringend Lerne dich einen Haskell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top