2017-11-15 4 views
-1

Ich bin neu zu ML, also tue ich mein Bestes, um zu verstehen.Schreibe ML Funktion

Schreiben Sie eine ML-Funktion namens alternate : 'a list -> 'a list, die zwei gleich lange Listen als Eingabe benötigt und eine Ausgabeliste erzeugt, deren Elemente abwechselnd aus der ersten bzw. zweiten Eingabeliste übernommen werden.

Beispiel

alternate ([1,3,5],[2,4,6]) = [1,2,3,4,5,6] 

Das ist meine Arbeit: fun alternate (x::xs,y::ys) = x::alternate(x,y);

+0

Aus dem [Hilfe/Thema]: * 3. Fragen, die nach Hausaufgabenhilfe fragen, müssen eine Zusammenfassung der bisherigen Arbeit enthalten, um das Problem zu lösen, und __ eine Beschreibung der Schwierigkeit, die Sie haben, um es zu lösen .__ * – glennsl

+0

Die Typunterschrift, die Sie geben ('alternate: 'a Liste -> 'eine Liste') stimmt nicht mit dem Rest der Frage überein (was ungefähr zu sein scheint ('alternate: 'eine Liste *' eine Liste -> 'eine Liste'). In jedem Fall ist hier ein Hinweis : Der rekursive Fall kann das Vertauschen der Reihenfolge der beiden Argumente beinhalten, also spielt die Rolle von "x" in einem Aufruf die Rolle von "y" im nächsten und umgekehrt. –

Antwort

1

Sie teilen das Problem in zwei: Eine rekursive Fall und ein Basisfall. (1) Im rekursiven Fall lösen Sie eine Einheit des Problems, in diesem Fall platzieren Sie ein einzelnes Element aus jeder Liste vor dem Ergebnis und versuchen rekursiv, den Rest des Problems auf die gleiche Weise zu lösen. (2) Im Basisfall sind die Listen leer und das Ergebnis ist die leere Liste.

fun alternate (x::xs, y::ys) = x::y::alternate(xs, ys) 
    | alternate ([], []) = [] 
    | alternate _ = raise Fail "xs and ys don't have the same length" 

(3) Da die Funktion nur gut definiert ist, für die Eingabe von gleicher Länge, die allumfassenden Muster _ das zwei-Tupel entspricht Listen enthält, wobei eine leer ist und die andere nicht, und löst eine Ausnahme aus.

+0

Vielen Dank für Ihre ausführliche Erklärung –