Verständnis faltl in ML

7

Ich muss eine Funktion schreiben, die eine Liste von Strings aufnimmt und den größten String in der Liste findet. Das Catch ist, dass es mit List.foldl durch die Liste iterieren muss und rekursive Aufrufe außer denen in der Bibliotheksfunktion von List, foldl, nicht verwenden kann.

Ich schrieb

%Vor%

mit meiner Interpretation wie folgt:

-take in xs, wenn xs leer ist, gebe eine leere Zeichenkette zurück

- Sonst für das erste Element von xs Anruf List.foldl

-List.foldl übergibt eine anonyme Funktion, die die Länge von s überprüft, die den Akkumulator gegen das Kopfelement der Liste darstellen soll.

- Legen Sie den anfänglichen Akkumulator als leere Zeichenfolge und den anfänglichen Vergleichswert als den Anfang der ursprünglichen Liste fest, die von der Funktion höherer Ordnung übergeben wird

Es gibt jedoch keine Überprüfung ein.

Ich denke, mein Problem ist das Verständnis der List.foldl-Funktion selbst und wie genau sie ihre Parameter einliest. Kann jemand bitte eine Klarstellung geben?

    
Andrew McLaughlin 06.02.2013, 20:24
quelle

2 Antworten

26

Also für den von Ihnen geposteten Code:

  1. Sie brauchen den Fall für die leere Liste nicht. foldl wird sich darum kümmern. Übergeben Sie einfach xs an faltl statt x.
  2. foldl ist curried, also sollten Sie keine Klammern um die Parameter haben.

Ansonsten sieht es tatsächlich korrekt aus. Wie auch immer, wenn du immer noch nicht sicher bist, wie foldl funktioniert, hier ist eine wirklich lange und gründliche Erklärung;)

Okay, beginnen wir mit List.foldl.

%Vor%

Also, es gibt drei Parameter. Eine ist eine Funktion, um die wir uns später kümmern müssen, die zweite ist ein Wert des gleichen Typs wie der Rückgabetyp und der letzte ist die Liste.

Nehmen wir ein einfaches Beispiel - sagen wir, wir haben eine Liste von Ints, und wir wollen alle Zahlen summieren. Wir könnten das tun:

%Vor%

Oder wir können foldl verwenden (ich schreibe foldl statt List.foldl ab jetzt, weil ich faul bin).

Wir wissen also, dass die Liste der dritte Parameter ist. Die zweite sollte eine Art Startwert oder Akkumulator sein, etwas, das Sinn machen würde, wenn die Liste leer wäre. Für eine Summe wäre das 0.

Der erste Parameter ist eine Funktion, und das ist der schwierige Teil. Der Typ ist:

%Vor%

Okay, also ist a auch der Typ der Elemente in der Liste, also macht es Sinn, wenn es sich um ein Element aus der Liste handelt. 'b ist der Typ des Startwerts und der Rückgabewert.

Was tatsächlich passiert, ist, dass foldl die Funktion mit dem ersten Element in der Liste und dem Akkumulator aufruft. Es ruft sich dann mit dem Ergebnis als neuer Akkumulator und dem Rest der Liste auf. Also wenn wir das tun:

%Vor%

Es wird

%Vor%

Und dann

%Vor%

Und so weiter.

Um eine Liste zu summieren, nehmen wir folgende Funktion vor:

%Vor%

So können wir das tun:

%Vor%

Oder noch einfacher

%Vor%

( op+ macht dasselbe wie die anonyme Funktion, die ich früher benutzt habe)

Gehen wir es mit der Liste [1,2,3]

durch %Vor%     
Tayacan 06.02.2013 23:08
quelle
0

Der folgende Code ist die Lösung für Ihr Problem:

%Vor%     
Andres Sacco 11.02.2013 17:39
quelle