機能と手順は、Mozart Ozで同じコードで異なる動作をしますか?
質問
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で同様の効果があると思います。
解決
関数は、関数呼び出しSyntaxを使用して呼び出す必要があります。
_ = {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}
ただし、このようにループする機能を使用すると、興味深いものがない場合はあまり意味がありません。多分あなたが本当に望んでいるのはそうです リストを作成し、結果として返します?
他のヒント
の定義にタイプミスがあります Loo
13行目。
あなたは呼んでいます Loop
, 、存在しません。私はあなたが電話するべきだと思います Loo
.
アップデート: あなたが見ているのは、機能と手順の違いによるものです。関数は常に値を返しますが、手順はありません。あなたは単一の議論をしています Loo
(K-1
)、 しかし Loo
2つの引数が必要です。 1つの入力変数と1つの変数が戻り値をキャプチャします。オズは、あなたが間違ったアリティを適用していると言ってこれを教えてくれます Loo
(2つの引数(バイナリ)を適用する必要がある場合、1つの引数(単位)を適用しています)。
これは、変数にも返品値を割り当てる必要があることを意味します。 1つを実行します:
A = {Loo K-1}
{Loo K-1 A}
A
戻り値が割り当てられる変数です。関数が何を返すかを気にしない場合の一般的な条約 _
return変数名として。