我试图学习来自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由于是一种功能语言,因此没有这样做的原语。因此,您不得不以功能性方式来执行此操作,最后通常是更优雅的方法。

09-26 17:21
查看更多