Pregunta

Tratando de averiguar cómo obtener la raíz cuadrada en SML usando este pseudocódigo:

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

El profesor nos dio estas fórmulas, tenemos que resolver el problema en SML.

Lo he probado de varias maneras diferentes, pero publicaré las diferentes formas con los errores a través de la consola:

- 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>))

Las líneas marcadas con un '-' son una entrada rápida de mí y todos los demás son devueltos por el sistema interactivo.

Se agradece cualquier ayuda gracias.

¿Fue útil?

Solución

@PopovitsJ tiene una buena inclinación.

SML utiliza la coincidencia de patrones para determinar qué versión de la definición de función usar.

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

No es determinista, y SML no tiene la facilidad para retroceder e intentar otra definición si la intenta falla (es decir, como Prolog).

En este escenario puedes usar

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

Esta función es lógicamente válida solo si le está pasando un valor que cuando se pasa originalmente fallará la expresión IF.

No he probado esto, pero creo que debería ayudar.

Otros consejos

¿Quizás esto es útil? El pseudocódigo implementado en Python:

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

Para SML, no puedo verificar esto, porque no tengo un compilador SML, pero ¿tal vez esto funcionaría?

fun sqrt (x, s) = if s*s <= x then s else sqrt(x,s-1)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top