SML: get index des Elements in der Liste
Ich bin neu in der SML und ich bin versucht, um den index eines Elements in einer Liste. Ich weiß, dass mit Liste.N-TEN geben mir den Wert eines Elements an index-position, aber ich will den index-Wert. Es kann sogar eine eingebaute Funktion, die ich nicht kenne. In meinem Fall, die Liste enthält keine Duplikate, so dass, wenn das Element in der Liste, die ich, um den index, wenn er es nicht zurückgibt, ~1. Hier ist der code, den ich bisher haben. Es funktioniert, aber ich glaube nicht, es ist sehr sauber:
val L=[1,2,3,4,5];
val m=length L-1;
fun Index(item, m, L)=if m<0 then ~1 else
if List.nth(L, m)=item then m else Index(item,m-1,L);
- Was genau ist Ihre Frage? Ich glaube, es ist keine standard-Funktion, die dies explizit, zumindest nicht in der Liste Struktur. Wie für die Reinigung von code, ich würde vorschlagen, 1) mit Option oder eine Ausnahme anstatt
~1
, 2) parameter ausblendenm
durch die Verpackung die Funktion einer äußeren Funktion, 3) mit der Mustererkennung werden aufm
zur Beseitigung einer bedingten (if m < 0 ...
) - Danke für die Tipps. Die Frage war eigentlich, "Was ist der beste Weg, dies zu tun?". Es wäre schön, nicht zu pass m in der Funktion, da kommt es auf die Länge von L sowieso, aber wie gesagt ich bin neu in SML nicht sicher, wie die beiden zu verbinden. Der Grund für den code; ich habe zwei Listen von verschiedenen Arten, die miteinander verwandt sind. Das update eines Elements in der Liste benötigt man das update für ein Element in der gleichen position in der Liste zwei. Ich glaube, dass die Struktur der Liste könnte so etwas mit "zip", aber das ist eine Arbeit für jetzt.
InformationsquelleAutor One Freak | 2013-07-24
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rücksicht auf meinen vorherigen Kommentar, ich schlage vor, einige änderungen für eine Umsetzung, die passt besser in die ML-idiom:
Den einzelnen änderungen sind:
index
einen Rückgabewert des Typsint option
.NONE
bedeutet, dass das Element nicht in der ListeSOME i
bedeutet, es ist in der Liste und dem index des ersten Vorkommensi
. Auf diese Weise werden keine besonderen Werte (~1
) müssen verwendet werden, und die Funktion für die beabsichtigte Verwendung abgeleitet werden kann, von seiner Art.m
durch die Umbenennung der Funktion zuindex'
und wickeln Sie es in eine äußere Funktionindex
fordert, dass es mit den entsprechenden Argumenten. Die prime - Zeichen (`) deutet Häufig auf Hilfs-Werte.List.nth
.Beachten Sie auch, dass die meisten allgemein -, Funktions-und Variablennamen mit einem Kleinbuchstaben beginnen (index eher als Index), während die Großbuchstaben sind für Konstanten Konstruktor (EINIGE) und dergleichen.
Ich würde gerne vorschlagen, eine einfachere und weniger effiziente version dieses
index
Funktion. Ich bin damit einverstanden, dass es nicht als wünschenswert Ausnahmen eher alsint option
sind, und es ist nicht tail-rekursiv. Aber es ist sicherlich einfacher zu Lesen und kann daher dienen als Lern-material: