我正在编写一个Erlang函数,它将每个偶数打印到给定参数.
到目前为止,我已经用这样的守卫编写了这个函数:
printEven(I,N) when I < N ->
if
I rem 2 == 0 -> io:format("~p~n",[I]), printEven(I+1,N);
I rem 2 == 1 -> printEven(I+1,N)
end;
printEven(I,N) ->
io:format("Done").
Run Code Online (Sandbox Code Playgroud)
我真的很想让最后一个案例自动退出,而不必在函数中打印任何东西.我试过删除它,但随后发生错误,因为递归完成后,会抛出错误.
我怎样才能做到这一点?在erlang中是否有类似'pass'或'yield'的关键字?
Gor*_*rie 11
好的,首先定义功能:
printEven(I,N) when I >= N -> ok;
printEven(I,N) ->
if
I rem 2 == 0 -> io:format("~p~n",[I]), printEven(I+1,N);
I rem 2 == 1 -> printEven(I+1,N)
end.
Run Code Online (Sandbox Code Playgroud)
Erlang是一种函数式编程语言,并且(根据定义)函数"具有"一个值,因此您将获得"某些东西".按照惯例,你在完成一个用于副作用的函数时得到的东西就是原子'ok',这是最好用的.
如果需要,您可以"静默地丢弃"返回值.当你通过模式匹配'do not care'变量(下划线)来调用函数时,你可以这样做:
_ = printEven(3,9),
Run Code Online (Sandbox Code Playgroud)
或者通过调用没有模式匹配的函数:
printEven(3,9),
Run Code Online (Sandbox Code Playgroud)
但是,在调用函数时,最好通过模式匹配来检查返回值:
ok = printEven(3,9),
Run Code Online (Sandbox Code Playgroud)
这是一个非常好的习惯,因为你将使用很多库函数返回错误代码,你可以从他们的规范中看到:
@spec funky(X) -> [ok | {error, bad_op} | {error, wig_out}]
Run Code Online (Sandbox Code Playgroud)
如果funky有副作用你想知道它现在失败了,通过模式匹配调用它所以它会在这里崩溃,现在如果funky失败:
ok = funky(99),
Run Code Online (Sandbox Code Playgroud)
如果你把它匹配'_'或忽略的返回值就会死机268线后,当你的魔力预计时髦已经完成了他的唐卡,然后是多少很难找到.
这是一个快乐的路径编程,这是Erlang中完成的事情."让它崩溃"是座右铭.如果你是Erlang的新手,你会发现这非常令人不安 - 就像赤身裸体走路一样.别担心拥抱它,这是一件好事.它导致许多代码"没有被写入".
(你也应该得到把该结束递归作为TOP子句条款的习惯,如下图所示-它使阅读代码的sooo容易得多,当你有一个多子句功能.)
| 归档时间: |
|
| 查看次数: |
3213 次 |
| 最近记录: |