質問

この擬似コードを使用して、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式を失敗させる値を渡している場合にのみ、論理的に有効です。

私はこれをテストしていませんが、それが役立つはずだと思います。

他のヒント

おそらくこれは便利ですか? Pythonで実装された擬似コード:

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