我试图学习来自C++ / Java背景的Erlang。这迫使我重新考虑所有方法。
现在,我正在尝试写一些返回列表的N个前元素的东西。现在看起来像这样,尽管我不能在后卫或表达式中调用函数。 Erlang这样做的方式是什么?
take([Xh|Xr],N,Xn) ->
if
len(Xn) /= N -> take(Xr,N,app(Xh, Xn));
len(Xn) == N -> Xn
end.
我也尝试过调用该函数,但是那也不起作用:
take([Xh|Xr],N,Xn) ->
G = len(Xn);
if
G /= N -> take(Xr,N,app(Xh, Xn));
G == N -> Xn
end.
最佳答案
通常,遇到此类问题时,您需要切换到递归的思维方式,而不是所使用的迭代方式。这是我会做的:
take(List, N) ->
take(List, N, []).
take(_List, 0, Acc) ->
lists:reverse(Acc);
take([H|T], N, Acc) ->
take(T, N - 1, [H|Acc]).
对于使用促进迭代方法的语言的人来说,这很普遍,并且尝试将这种方法引入Erlang。问题在于,Erlang由于是一种功能语言,因此没有这样做的原语。因此,您不得不以功能性方式来执行此操作,最后通常是更优雅的方法。