2016-10-12 6 views
1

mit zwei Strings vergleichen und den String in eine Liste hinzufügen, wenn sie gleich sind, habe ich diese Funktion erstellt mit der integrierten Funktion vergleichen:Vergleicht Strings der ‚vergleichen‘ Funktion

fun compareString(string, list) = 
    if compare(string, "hello") = EQUAL then string::list; 

jedoch diese gibt einen Fehler. Ich denke, meine Syntax muss falsch sein, habe ich die Vergleichsfunktion korrekt verwendet?

Gemäß der Dokumentation, die Funktion arbeitet wie folgt vergleichen:

vergleichen (s, t) hat einen lexikographischen Vergleich der beiden Strings die Bestellung Char.compare auf den Zeichen. Sie gibt LESS, EQUAL oder GREATER zurück, wenn s kleiner als, gleich oder größer als t ist.

Antwort

5
  • Was Sie vergessen, die sonst ... Teil if-then-else. Dieser Teil ist obligatorisch.

  • Wahrscheinlich möchten Sie speziell die Funktion String.compare verwenden.

  • Wenn Sie sich nur für den gleichen Fall interessieren, können Sie einfach den Operator = verwenden.

  • Der Name compareString ist ein komischer Name für eine Funktion, die eine Zeichenfolge in eine Liste einbezieht.

  • Die Namen Zeichenfolge und Liste auch Variablennamen nicht sehr gut sind, weil sie den Zweck der Variablen nicht beschreiben. Wenn die Funktion generisch ist, sind möglicherweise generische Namen angemessen, und Sie können jedes Schema mit generischen Namen auswählen, das Ihnen gefällt.

  • Das Einschlussprädikat (dass eine Zeichenkette gleich "hello" sein muss) scheint etwas albern, da Sie genau wissen, wie diese Liste aussehen wird; es ist isomorph zu einer positiven ganzen Zahl. Wenn Sie stattdessen das Einschlussprädikat in einen Parameter umgewandelt haben, ist die Funktion möglicherweise nützlich.

Zum Beispiel:

fun consIf (p, x, xs) = 
    if p x 
    then x :: xs 
    else xs 

fun is_greeting x = List.exists (fn y => x = y) ["hello", "hi", "good day"] 
val ys = consIf (is_greeting, "hello", ["hi"]) 

Oder diese machen in einen binären Operator und nennen Sie es ::? weil es :: mit einer Bedingung ähnelt:

infixr 5 ::? 
fun x ::? xs = fn p => if p x then x::xs else xs 

val ys = ("boaty mcboatface!" ::? ["hi"]) is_greeting