gpt4 book ai didi

函数和过程在 Mozart Oz 中使用相同的代码表现不同?

转载 作者:行者123 更新时间:2023-12-04 11:30:15 27 4
gpt4 key购买 nike

我尝试使用 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 中具有类似的效果。

最佳答案

必须使用函数调用语法调用函数:

_ = {Loo 10}

或者使用附加参数来接收值:
{Loo 10 _}
_发音为“don't care”,表示不需要变量的值。

此外,函数必须通过将表达式作为每个分支的最后一部分来返回值。所以你的固定 Loo函数看起来像这样:
fun {Loo L}
if L == 1 then
{Browse L}
unit
else
_ = {Loo L-1}
{Browse {Fibo L}}
unit
end
end
_ = {Loo 10}

但是,如果您没有任何有趣的返回值,那么使用像这样的循环函数没有多大意义。也许你真正想要的是 build a list and return it as the result ?

关于函数和过程在 Mozart Oz 中使用相同的代码表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5830238/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com