Duc*_*ran 7 procedure function mozart oz
我尝试使用2种方法在Oz中打印出Fibonacci序列:使用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}
Run Code Online (Sandbox Code Playgroud)
和功能:
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}
Run Code Online (Sandbox Code Playgroud)
问题是唯一的过程"循环"工作.结果是:
1
1
2
3
5
8
13
21
34
55
Run Code Online (Sandbox Code Playgroud)
函数"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)
Run Code Online (Sandbox Code Playgroud)
我还是不知道为什么.我认为功能和程序在OZ中具有类似的效果.
必须使用函数调用语法调用函数:
_ = {Loo 10}
Run Code Online (Sandbox Code Playgroud)
或者使用附加参数来接收值:
{Loo 10 _}
Run Code Online (Sandbox Code Playgroud)
_ 发音为"do not care",表示不需要变量的值.
此外,函数必须通过将表达式作为每个分支的最后部分来返回值.所以你的固定Loo功能看起来像这样:
fun {Loo L}
if L == 1 then
{Browse L}
unit
else
_ = {Loo L-1}
{Browse {Fibo L}}
unit
end
end
_ = {Loo 10}
Run Code Online (Sandbox Code Playgroud)
但是,如果你没有任何有趣的东西可以返回,那么使用这样的循环函数没有多大意义.也许你真正想要的是建立一个列表并将其作为结果返回?
| 归档时间: |
|
| 查看次数: |
3449 次 |
| 最近记录: |