Frage

Versuchen Sie herauszufinden, wie Sie die Quadratwurzel in SML mit diesem Pseudocode erhalten:

sqrt x s = s if s*s <= x
sqrt x s = sqrt x (s-1) if s*s > x

Diese Formeln wurden uns vom Dozenten gegeben, wir müssen das Problem in SML lösen.

Ich habe es ein paar verschiedene Arten ausprobiert, aber ich werde die unterschiedlichen Arten mit den Fehlern über die Konsole veröffentlichen:

- fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);
stdIn:32.39-32.45 Error: syntax error: deleting  BAR ID
stdIn:32.52-32.56 Error: syntax error: deleting  IF LPAREN
stdIn:32.59-32.62 Error: syntax error: deleting  RPAREN ID
stdIn:32.65-32.74 Error: syntax error: deleting  THEN ID
- fun sqrt x s = s if ((s*s) <= x) | sqrt x (s - 1);
stdIn:10.2-17.4 Error: syntax error: deleting  IF LPAREN
stdIn:17.14 Error: syntax error found at RPAREN
- fun sqrt x s = s if s*s <= x | sqrt x (s - 1);
stdIn:10.2-17.4 Error: syntax error: deleting  IF ID
- fun sqroot x s = s if s*s <= x | sqrt x (s - 1);
stdIn:17.2-17.6 Error: syntax error: deleting  IF ID
- fun sqrt x s = s IF s*s <= x | sqrt x (s - 1);
= ;
= ;
= ;;
stdIn:17.28-34.2 Error: syntax error: deleting  SEMICOLON SEMICOLON SEMICOLON
- fun sqrt x s = s IF s*s <= x END | sqrt x s = sqrt x (s-1) IF s*s > x END;
stdIn:17.12-17.15 Error: unbound variable or constructor: END
stdIn:10.2-17.2 Error: unbound variable or constructor: IF
stdIn:35.20-35.23 Error: unbound variable or constructor: END
stdIn:35.9-35.11 Error: unbound variable or constructor: IF
stdIn:1.17-17.15 Error: operator is not a function [circularity]
  operator: 'Z
  in expression:
    (s <errorvar>) s
stdIn:1.17-17.15 Error: operator and operand don't agree [overload]
  operator domain: 'Z * 'Z
  operand:         _ * (_ -> 'Y)
  in expression:
    (s <errorvar>) s * s
stdIn:1.6-35.23 Error: types of rules don't agree [literal]
  earlier rule(s): (_ -> int) * (_ -> 'Z) -> bool
  this rule: (_ -> int) * int -> bool
  in rule:
    (x,s) => (<exp> <exp>) s * s > x <errorvar>
stdIn:1.6-35.23 Error: right-hand-side of clause doesn't agree with function result type [literal]
  expression:  (_ -> 'Z) -> bool
  result type:  int -> _ -> int -> int
  in declaration:
    sqrt = (fn arg => (fn <pat> => <exp>))

Zeilen, die mit einem '-' gekennzeichnet sind, sind sofortige Eingaben von mir und alle anderen werden vom interaktiven System zurückgegeben.

Jede Hilfe wird geschätzt, danke.

War es hilfreich?

Lösung

@Popovitsj hat eine gute Neigung.

SML verwendet das Musteranpassung, um zu bestimmen, welche Version der Funktionsdefinition verwendet werden soll.

fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);

Ist nicht deterministisch, und SML verfügt nicht über die Möglichkeit, eine andere Definition zu erzielen und zu versuchen, wenn die von ihm versehentlich versuchte (dh Prolog).

In diesem Szenario können Sie einfach verwenden

fun sqrt x s = if s * s <= x then s else sqrt x (s-1);

Diese Funktion ist nur logisch gültig, wenn Sie sie übergeben, dass bei ursprünglich bestandener Ausdruck den Wert fehlschlägt.

Ich habe das nicht getestet, aber ich glaube, es sollte helfen.

Andere Tipps

Vielleicht ist das nützlich? Der in Python implementierte Pseudocode:

def sqrt(x,s):
    if (s*s <= x):
        return s
    return sqrt(x,s-1)

Für SML kann ich das nicht überprüfen, weil ich keinen SML -Compiler habe, aber vielleicht würde das funktionieren?

fun sqrt (x, s) = if s*s <= x then s else sqrt(x,s-1)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top