8

2つのアプローチを使用してOzでフィボナッチ数列を印刷してみます:エディターとしてEmacを使用する関数と手順。手順はここにあります:

declare 
fun {Fibo N} 
   case N of 
      1 then 1 
   [] 2 then 1
[] M then {Fibo (M-1)} + {Fibo (M-2)} 
   end 
end 
declare
proc {Loop K}
   if K ==1 then  {Browse K}
   else
      {Loop K-1}
       {Browse {Fibo K}}
   end
end
{Loop 10}

および機能:

declare 
fun {Fibo N} 
   case N of 
      1 then 1 
   [] 2 then 1
[] M then {Fibo (M-1)} + {Fibo (M-2)} 
   end 
end
declare
fun {Loo L}
   if L ==1 then  {Browse L}
   else
      {Loo L-1}
       {Browse {Fibo L}}
   end
end
{Loo 10}

問題は、プロシージャ「ループ」が機能することだけです。結果は次のとおりです。

1
1
2
3
5
8
13
21
34
55

関数「Loo」はそうではなく、理解しにくいエラーをスローします。

%********************** static analysis error *******************
%**
%** illegal arity in application
%**
%** Arity found:          1
%** Expected:             2
%** Application (names):  {Loo _}
%** Application (values): {<P/2> _<optimized>}
%** in file "Oz", line 13, column 6

%********************** static analysis error *******************
%**
%** illegal arity in application
%**
%** Arity found:          1
%** Expected:             2
%** Application (names):  {Loo _}
%** Application (values): {<P/2> 10}
%** in file "Oz", line 17, column 0
%** ------------------ rejected (2 errors)

理由はまだわかりません。私が思うに、機能と手順はOZでも同様の効果があります。

4

2 に答える 2

6

関数は、関数呼び出し構文のいずれかで呼び出す必要があります。

_ = {Loo 10}

または、代わりに追加のパラメーターを使用して値を受け取ります。

{Loo 10 _}

_「ドントケア」と発音され、変数の値が必要ないことを意味します。

また、関数は、すべての分岐の最後の部分として式を持つことによって値を返す必要があります。したがって、固定Loo関数は次のようになります。

fun {Loo L}
   if L == 1 then
      {Browse L}
      unit
   else
      _ = {Loo L-1}
      {Browse {Fibo L}}
      unit
   end
end
_ = {Loo 10}

ただし、このように関数をループに使用しても、返すものが何もない場合はあまり意味がありません。たぶん、あなたが本当に欲しいのは、リストを作成して結果として返すことですか?

于 2011-04-29T20:29:44.173 に答える
3

Loo13行目の定義にタイプミスがあります。

Loop存在しない を呼び出しています。に電話する必要があると思いますLoo

更新:あなたが見ているのは、関数と手続きの違いによるものです。関数は常に値を返しますが、プロシージャは返しません。Loo( K-1) に1 つの引数を指定していますが、 Loo2 つの引数が必要です。1 つの入力変数と、戻り値を取得するための 1 つの変数。Oz は、間違ったアリティを適用していると言ってこれを伝えますLoo(2 つの引数 (バイナリ) を適用する必要があるときに、1 つの引数 (単項) を適用しています)。

これは、戻り値も変数に割り当てる必要があることを意味します。次のいずれかを実行します。

  1. A = {Loo K-1}
  2. {Loo K-1 A}

A戻り値が割り当てられる変数です。関数が何を返すかを気にしない場合の一般的な規則は_、戻り変数名として使用することです。

于 2011-04-29T09:29:12.217 に答える