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.