f6(List) ->
[Head2 | Tail2 ] <- [List],
Head2.
Tail2.
Здравствуйте, я пытался выяснить, как использовать Head и Tail без использования fun, и для оболочки мы можем просто назначить голову и хвост как [H | T] = A. Но для редактора я совершенно не знаю, как я только учусь. любая помощь будет оценена. Мне просто нужно знать, как выглядит простое добавление числа в список с помощью H&T.
Пример ввода: [1,2,3] или любые три числа, и на выходе будет что-то вроде 6 общего числа. Я застрял там, где могу просто назначить список голове и хвосту.
Простите за неправильный формат, если таковой имеется, и заранее спасибо.





Пара насущных проблем:
<- используется в списках. См. https://www.erlang.org/doc/programming_examples/list_comprehensions.html или https://learnyousomeerlang.com/starting-out-for-real#list-comprehensions.
Присваивание (фактически сопоставление) работает так же в модуле:
[H | T] = L,
% ...do something with H and T...
Следующий:
[Head2 | Tail2 ] <- [List],
Это тоже не то, что вы хотите, даже если мы исправим <-. Вы заключили свой список в другой список, поэтому, если вы начали с List = [1, 2, 3], вы на самом деле будете делать [Head2 | Tail2] = [[1, 2, 3]], а закончите Head2 = [1, 2, 3] и Tail2 = [].
Вне оболочки вы должен помещаете свой код Erlang в модуль, поэтому в итоге вы получите что-то вроде этого (имя модуля должно совпадать с именем файла, поэтому my_module.erl):
-module(my_module).
% ...
В вашем примере кода я исправил две вышеупомянутые проблемы, в результате чего у нас осталось:
f6(List) ->
[Head2 | Tail2 ] = List,
Head2.
Tail2.
Это все равно не сработает, потому что точка (.) означает конец функции. Так что Tail2. просто болтается, вызывая синтаксическую ошибку.
Если вы хотите суммировать три числа в списке, самый простой вариант:
-module(my_module).
f6([A, B, C]) ->
A + B + C.
Это использует сопоставление в заголовке функции. Это требует список из трех элементов, и он сопоставляется с ним таким образом, что каждый из A, B и C принимает один из элементов. Затем вы можете добавить их.
Это не очень гибко. То, что вы, вероятно, хотели, было рекурсией:
% don't do this, though; read on.
sum([H | T]) ->
H + sum(T);
sum([]) ->
0.
Но, который взорвет стек, потому что он не является хвостовой рекурсией. То, что вы, на самом деле, хотите, это:
sum(List) ->
sum(List, 0).
sum([], Acc) ->
Result;
sum([Elt | Rest], Acc) ->
sum(Rest, Acc + Elt).
Это использует аккумулятор с хвостовой рекурсией для добавления значений в список.
Это можно переписать следующим образом (взято непосредственно из документации https://www.erlang.org/doc/man/lists.html#foldl-3:
sum(List) -> lists:foldl(fun(X, Sum) -> X + Sum end, 0, List).
Но, если вы, В самом деле, хотели короткую версию, lists:sum(List) уже есть. См. https://www.erlang.org/doc/man/lists.html#sum-1
I have been trying to figure out the way to use Head and Tail without using fun and for the shell we can just assign the head and tail as [H|T] = A. But for the editor I have absolutely no idea...
В оболочке:
~/erlang_programs$ erl
Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]
Eshell V12.0.2 (abort with ^G)
1> List = [dog, 20, 30].
[dog,20,30]
2> [H|T] = List.
[dog,20,30]
3> io:format("Head = ~w~n", [H]).
Head = dog
ok
4> io:format("Tail = ~w~n", [T]).
Tail = [20,30]
ok
Вот идея:
-module(a).
-export([f1/1]).
f1(List) -> %% or you could write it as f([H|T]) ->
[H|T] = List,
io:format("Head = ~w~n", [H]),
io:format("Tail = ~w~n", [T]).
Использование модуля в оболочке:
~/erlang_programs$ erl
Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]
Eshell V12.0.2 (abort with ^G)
1> c(a).
{ok,a}
2> List = [dog, 20, 30].
[dog,20,30]
3> a:f1(List).
Head = dog
Tail = [20,30]
ok
Почти идентичны.
I just need to know how a simple adding the number in a list with H & T looks like.
Вот нужная вам хитрость:
-module(a).
-export([sum_it/1]).
sum_it(List) ->
StartTotal = 0,
sum_it(List, StartTotal).
sum_it([H|T], Total) ->
CurrentTotal = Total + H,
sum_it(T, CurrentTotal);
sum_it([], Total) ->
Total.
Вы определяете функцию sum_it/1, которая ничего не делает, кроме как принимает аргумент, а затем вызывает другую функцию для выполнения этой работы: sum_it/2. Определение второй функции, которая может иметь то же имя (поскольку у нее другое количество аргументов) или другое имя, позволяет вам передать дополнительный аргумент для аккумулятора. Поскольку в erlang нет глобальных переменных для хранения результатов, вы можете добавить переменную-аккумулятор к переменным параметра функции для сохранения результатов.
В случае определения функции sum_it/2 у вас есть переменная параметра функции [H|T] для соответствия списку, который содержит числа, которые вы хотите суммировать, и вы добавляете переменную-накопитель Total для хранения результатов.