Есть ли лучший способ написать «Голова и хвост» без использования веселья?

f6(List) ->
     
          [Head2 | Tail2 ] <- [List],
          Head2.
          Tail2.

Здравствуйте, я пытался выяснить, как использовать Head и Tail без использования fun, и для оболочки мы можем просто назначить голову и хвост как [H | T] = A. Но для редактора я совершенно не знаю, как я только учусь. любая помощь будет оценена. Мне просто нужно знать, как выглядит простое добавление числа в список с помощью H&T.

Пример ввода: [1,2,3] или любые три числа, и на выходе будет что-то вроде 6 общего числа. Я застрял там, где могу просто назначить список голове и хвосту.

Простите за неправильный формат, если таковой имеется, и заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пара насущных проблем:

<- используется в списках. См. 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 для хранения результатов.

Другие вопросы по теме