функция, получающая список и создающая (???) для каждого значения
В функциональных языках эту операцию обычно называют "map". В Gleam есть функция для списков с названием map (https://hexdocs.pm/gleam_stdlib/gleam/list.html#map), которая, похоже, соответствует вашей задаче. Например, если написать такое выражение
list.map([2, 3, 4], fn(entry) { "entry: " <> int.to_string(entry) })
результатом будет список с преобразованными элементами. После этого list.intersperse (https://hexdocs.pm/gleam_stdlib/gleam/list.html#intersperse) позволяет соединить список, вставляя дополнительный элемент между соседними элементами (этот помощник далеко не так универсален среди функциональных языков).
Похоже, в Gleam есть конвейеры наподобие Elixir (https://tour.gleam.run/functions/pipelines/), поэтому я, возможно, записал бы это так
[2, 3, 4]
|> list.map(fn(entry) { "entry: " <> int.to_string(entry) })
|> list.intersperse(", ")
Ещё две операции, которые я считаю основополагающими для функционального программирования, это reduce или fold, сводящие список к одному результату, и filter, принимающая список и предикат и создающая список только из элементов, прошедших проверку. Одни операции можно выразить через другие (в частности, через fold можно реализовать и map, и filter, хотя, возможно, неэффективно), но по моему опыту выбор подходящей операции делает код понятнее и нередко быстрее.
Переведено с английского·Показать оригинал
a function receiving a list and producing a (???) for every value
Functional languages normally call this operation "map". There is a list function called map in Gleam (https://hexdocs.pm/gleam_stdlib/gleam/list.html#map), which seems to match what you need. For example, with an expression such as
list.map([2, 3, 4], fn(entry) { "entry: " <> int.to_string(entry) })
the result would be a list containing the transformed entries. Afterwards, list.intersperse (https://hexdocs.pm/gleam_stdlib/gleam/list.html#intersperse) lets you join that list with an extra entry placed between successive elements (a helper that isn't nearly as universal in functional languages).
Gleam appears to offer pipelines similar to Elixir's (https://tour.gleam.run/functions/pipelines/), so I'd perhaps express it as
[2, 3, 4]
|> list.map(fn(entry) { "entry: " <> int.to_string(entry) })
|> list.intersperse(", ")
Two more operations that I regard as fundamental across functional programming include reduce or fold, taking a list down to one result, and filter, accepting a list plus a predicate and producing a list containing the entries passing that predicate. Some can be expressed through others (in particular, fold can implement map as well as filter, albeit perhaps inefficiently), but in my experience selecting the appropriate operation is easier to follow and frequently quicker.