openlang

Форматирование элементов списка в текст при функциональном программировании

Я новичок в функциональном программировании и пытаюсь создать функцию, которая принимает список значений (длина которого заранее не задана) и выдаёт строку с форматированным представлением каждого значения.

Например, на псевдокоде:

 render_entries([2, 3, 4])
 // -> "entry: 2, entry: 3, entry: 4"

(Конкретно я использую Gleam (https://gleam.run/), хотя ожидаю, что идея применима и к другим функциональным языкам, с отличиями лишь в синтаксисе)

Как можно это сделать?

Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    функция, получающая список и создающая (???) для каждого значения

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

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Lean4 сообщает, что 'begin' неизвестен

    В редакторе VSCode я ввёл такой код Lean4: и получил "unknown identifier 'begin'". Если добавить end тремя строками ниже, поя…

    Ответы 2Последняя активность lean-4
  2. Какой курс JavaScript стоит пройти?

    В последний раз я заглядывал в документацию JavaScript в 1996 году. Ищу учебный курс по “необходимому JavaScript и веб-концеп…

    Ответы 2Последняя активность elmjavascript
  3. Где найти fmt и пакет main?

    Многие примеры на go начинаются так : Мой GOPATH: Где хранятся main и модуль fmt?

    Ответы 2Последняя активность go