Geben Sie Signaturtypen für Listen usw. ein
-
28-10-2019 - |
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.
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 => ...
meinta
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 ana
. Ein offensichtliches Beispiel einer Funktion, die diese Einschränkung erfordert, istsort :: Ord a => [a] -> [a]
; Lesen Sie diese Signatur, um das zu sagensort
funktioniert nur auf Listen der Dinge, die in Bezug aufeinander in Ordnung gebracht werden können.Eq a => ...
meinta
ist ein Typ, dessen Mitglieder für einen Begriff der Gleichheit miteinander verglichen werden können. In mathematischer Hinsicht gibt es eine Äquivalenzbeziehung ana
. Beachten Sie, dass dies eine Superklasse von istOrd
, 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, istelem :: Eq a => a -> [a] -> Bool
(was bestimmt, ob eine Liste ein bestimmtes Element enthält); Lesen Sie diese Signatur, um das zu sagenelem
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ürdenelem
selbst, das sollte Sinn machen.Num a => ...
meinta
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 sehenNum 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.