基本 Erlang - 守卫等中函数调用的替代方案

Ric*_*ard 4 erlang

我正在尝试学习 Erlang,来自 C++/Java 背景。这迫使我重新思考我所有的方法。

现在我正在尝试编写一些返回列表的前 N ​​个元素的东西。现在看起来像这样,虽然我不能在守卫或 if 表达式中调用函数。这样做的 Erlang 方式是什么?

take([Xh|Xr],N,Xn) ->
    if
        len(Xn) /= N -> take(Xr,N,app(Xh, Xn));
        len(Xn) == N -> Xn
    end.
Run Code Online (Sandbox Code Playgroud)

我之前也尝试过调用该函数,但这也不起作用:

take([Xh|Xr],N,Xn) ->
   G = len(Xn);
    if
        G /= N -> take(Xr,N,app(Xh, Xn));
        G == N -> Xn
    end.
Run Code Online (Sandbox Code Playgroud)

Fyl*_*lke 5

通常对于此类问题,您需要切换到递归思维方式,而不是您正在使用的迭代方法。这是我会做的:

take(List, N) ->
    take(List, N, []).
take(_List, 0, Acc) ->
    lists:reverse(Acc);
take([H|T], N, Acc) ->
    take(T, N - 1, [H|Acc]).
Run Code Online (Sandbox Code Playgroud)

对于来自提倡迭代方法的语言的人来说,尝试将这种方法硬塞到 Erlang 中是很常见的。问题是 Erlang 没有这样做的原语,因为它是一种函数式语言。所以你被迫以函数式的方式来做,最后它通常是更优雅的方法。