문제

이 의사 코드를 사용하여 SML에서 제곱근을 얻는 방법을 해결하려고합니다.

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

이 공식은 강사에 의해 우리에게 주어졌으며, 우리는 SML에서 문제를 해결해야합니다.

몇 가지 다른 방법을 시도했지만 콘솔을 통한 오류와 함께 다른 방법을 게시하겠습니다.

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

'-'로 표시된 라인은 나의 프롬프트 입력이며 다른 모든 사람들은 대화식 시스템에 의해 반환됩니다.

감사합니다. 감사합니다.

도움이 되었습니까?

해결책

@popovitsj는 좋은 성향을 가지고 있습니다.

SML은 패턴 일치를 사용하여 사용할 기능 정의의 버전을 결정합니다.

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

비 결정적이며, SML은 시도하는 것이 실패한 경우 (즉, Prolog와 같은) 다른 정의를 역 추적하고 시도 할 시설을 가지고 있지 않습니다.

이 시나리오에서는 만 사용할 수 있습니다

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

이 기능은 원래 통과 할 때 IF 표현식에 실패하는 값을 전달하는 경우에만 논리적으로 유효합니다.

나는 이것을 테스트하지 않았지만 도움이 될 것이라고 믿는다.

다른 팁

아마도 이것은 유용할까요? 파이썬으로 구현 된 의사 코드 :

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

SML의 경우 SML 컴파일러가 없기 때문에 이것을 확인할 수 없지만 아마도 이것이 효과가 있을까요?

fun sqrt (x, s) = if s*s <= x then s else sqrt(x,s-1)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top