Fallanweisungen und Musterabgleich

8

Ich schreibe in SML für eine Aufgabe und ich habe ein paar Übungsprobleme gemacht und ich habe das Gefühl, dass ich etwas vermisse - ich habe das Gefühl, dass ich zu viele case -Anweisungen verwende. Hier ist, was ich mache und die Problemaussagen für das, womit ich Probleme habe.:

  1. Schreiben Sie eine Funktion all_except_option, die eine Zeichenfolge und eine String-Liste verwendet. Geben Sie NONE zurück, wenn die Zeichenfolge nicht in der Liste enthalten ist, andernfalls geben Sie SOME lst zurück, wobei lst der Argumentliste entspricht, mit Ausnahme der Zeichenfolge, die nicht darin enthalten ist.

    %Vor%
  2. Schreiben Sie eine Funktion get_substitutions1, die eine String-Liste (eine Liste von Strings, die Ersetzungen) und eine Zeichenfolge s übernimmt und eine String-Liste zurückgibt. Das Ergebnis enthält alle Zeichenfolgen, die sich in einer Liste in Ersetzungen befinden, die auch s enthalten, aber s selbst sollte nicht im Ergebnis enthalten sein.

    %Vor%

- same_string ist eine bereitgestellte Funktion, fun same_string(s1 : string, s2 : string) = s1 = s2

    
user998876 17.10.2011, 09:37
quelle

3 Antworten

9

Zuerst würde ich die Mustererkennung in der Funktionsdefinition verwenden anstatt eine "Top-Level" -Case-Anweisung zu haben. Es läuft im Grunde auf die dasselbe nach dem Entzuckern. Außerdem würde ich die expliziten Typ-Anmerkungen loswerden, wenn sie nicht unbedingt benötigt werden:

%Vor%

Wenn Geschwindigkeit keine Rolle spielt, könnten Sie die beiden Fälle in der ersten Funktion zusammenführen:

%Vor%

Aber da Sie append (@) verwenden, in der zweiten Funktion, und da ist es nicht Schwanz rekursiv, ich glaube nicht, dass es Ihre Hauptsorge ist. Denk daran, dass Append ist potentiell "böse" und Sie sollten fast immer Verkettung (und dann kehren Sie Ihr Ergebnis um, wenn Sie es zurückgeben) und Tail - Rekursion, wenn möglich (it ist immer).

Wenn Sie die Anmerkungen des expliziten Typs wirklich mögen, dann könnten Sie es so machen:

%Vor%

Aber das ist nur meine bevorzugte Methode, wenn ich wirklich Typ Anmerkungen hinzufügen muss.

Übrigens, warum haben Sie die Funktion same_string ? Sie können stattdessen direkt den Vergleich durchführen. Die Verwendung einer Hilfsfunktion ist einfach seltsam, es sei denn, Sie planen, sie irgendwann mit einer speziellen Logik zu ersetzen. Aber deine Funktionsnamen brauchen das nicht.

    
Jesper.Reenberg 17.10.2011, 10:21
quelle
1

Zusätzlich zu dem, was Jesper Reenberg erwähnt hat, wollte ich nur erwähnen, dass ein Match auf einem bool für true und false durch ein if - then - else ersetzt werden kann. Einige Leute betrachten jedoch if-then-else hässlicher als eine case-Anweisung     

user102008 17.10.2011 21:23
quelle
0
%Vor%     
Cyril 01.02.2013 04:59
quelle