1

次のコードが与えられた場合 (これは機能しません):

fun func() = 

val decimal = 0 (* the final result *)
val multiple = 0 (* keeps track of multiples, eg. In XXV, X would be a multiple *)
val current = 0 (* the digit currently being processed *)
val top = 0   (* value of the last element in the list *)
val last_add = 0 (* the last digit that wasn't a multiple, or subtraction operation *)
val last_sub = 0
val problem = 0 (* if value is 1 then there is a problem with the input *)

val myList = [1,2,3,4,5] (* the list has more values *)
val current = tl(myList) (* grab the last element from the list *)
val myList = tl(myList) (* remove the last element from the list *)
val top = tl(myList) (* grab the value at the end of the list *)



while (not(myList = []))    (* run while the list is not empty *)

if ( (not(myList = [])) andalso (current > top))
   then      

            val decimal = decimal + current - top
            val last_sub = top;
            val myList = tl(myList)
   else     
       if ( (myList = []) andalso (current = top))
          then val decimal = decimal + current
               val multiple = multiple + 1
          else
              if (last_sub = current)
                 then val problem = 1

                 else
                      val decimal = decimal + current
                      val multiple = 0
                      val last_add = current

これは部分的なコードであり、ステートメントval内では動作しないため、現時点では機能しません。if

  1. ループで実行したいのですwhileが、ML でそれを行うにはどうすればよいですか?

  2. 以前に ML で宣言された変数に値を代入および再代入するにはどうすればよいですか?

  3. キーワードは IF 条件内では使用valできないため、変数を更新できません。それを解決する方法はありますか?

よろしく

4

1 に答える 1

3

以前に ML で宣言された変数に値を代入および再代入するにはどうすればよいですか?

変数が ML で宣言された後は、変数に割り当てることはできません。

val キーワードは IF 条件内では使用できないため、変数を更新できません。それを解決する方法はありますか?

最上位を除いて、通常はvalandfunの内部で次のように使用しますlet

let
  val x = blah blah
  val y = blah blah
  fun f x y = blah blah
in
  some expression
end

ただし、これにより新しい変数が作成されることに注意してください (同じ名前の既存の変数を非表示にする可能性があります)。これは、let の本体のスコープ内に存在します。前に述べたように、既存の変数に代入することはできません。

while ループで実行したいのですが、ML でそれを行うにはどうすればよいですか?

あなたはほとんどそこにいます。構文はwhile condition do ( ... ). しかし、可変状態がなければ、while ループは役に立ちません。

可変状態が必要な場合は、可変データ構造を使用できます。この言語は、 と呼ばれる単純な「可変セル」を提供します。関数にref初期値を渡してセルを作成し、演算子でref現在の値を取得し、!演算子で新しい値を設定します:=;また、複数の命令型「ステートメント」を実行する場合は、それらを演算子で区切り、優先順位の問題によりステートメントの「ブロック」全体を括弧で囲む必要があることも覚えておく必要があります。

しかし、while ループと変更可能な状態を使用することは、実際には正しい方法ではありません。関数型言語を使用しており、アルゴリズムを純粋に関数型に書き直す方がはるかに優れています。難しいことではありません。while ループの本体を末尾再帰ヘルパー関数に変換すると、ループの反復間で変化する「変数」がこの関数の引数になります。これらの変数の値を「設定」しようとする代わりに、次の反復のために新しい値で自分自身を再帰的に呼び出すだけです。末尾再帰の場合、メモリの反復と同等です。

于 2012-12-28T19:43:23.793 に答える