Базовый Erlang - альтернативы вызовам функций в охране и т. Д. - PullRequest
3 голосов
/ 29 октября 2011

Я пытаюсь выучить Erlang, исходя из C ++ / Java.Это заставляет меня переосмыслить все свои методы.

Сейчас я пытаюсь написать что-то, что возвращает N первых элементов списка.Прямо сейчас это выглядит так, хотя я не могу вызывать функции в охранниках или выражениях.Как Эрланг это делает?

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.

Ответы [ 3 ]

4 голосов
/ 29 октября 2011

В дополнение к решению Филке, есть и кое-что, что можно сказать о рекурсивном подходе к телу:

take(_List,0) ->
  [];
take([H|T],N) ->
  [H|take(T,N-1)].
4 голосов
/ 29 октября 2011

Как правило, с такими проблемами вам нужно переключиться на рекурсивный способ мышления вместо итеративного подхода, который вы используете.Вот что я хотел бы сделать:

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.Проблема в том, что у Эрланга нет примитивов для этого, так как это функциональный язык.Таким образом, вы вынуждены сделать это функциональным способом, и в конце концов это часто более элегантный подход.

0 голосов
/ 30 октября 2011

Ваш подход сам по себе не ошибается, ему просто нужна помощь:

-module(foo).
-compile(export_all).

take([Xh|Xr],N,Xn) ->
    G = length(Xn), %% This line had trouble. Use length/1 and end with , not ;
    if
        G /= N ->
          take(Xr,N,app(Xh, Xn));
        G == N ->
          Xn
    end.

app(X, L) ->
    L ++ [X].

Как намекают другие люди, ваш подход не очень ирландский, и другие решения намного лучше. Также ищите исходный код для списков: split / 2

https://github.com/erlang/otp/blob/master/lib/stdlib/src/lists.erl#L1351

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...