我正在尝试学习 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)
通常对于此类问题,您需要切换到递归思维方式,而不是您正在使用的迭代方法。这是我会做的:
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 没有这样做的原语,因为它是一种函数式语言。所以你被迫以函数式的方式来做,最后它通常是更优雅的方法。