openlang

함수형 프로그래밍으로 리스트 원소를 텍스트로 서식화하기

함수형 프로그래밍을 처음 배우고 있어요. 길이가 정해지지 않은 값의 리스트를 받아서, 각 값을 일정한 형식으로 표현한 내용을 담는 문자열을 만드는 함수를 작성하려고 해요.

의사 코드로 예를 들면 이래요:

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

(제가 쓰는 언어는 Gleam (https://gleam.run/)이지만, 다른 함수형 언어에도 문법만 달리해서 같은 생각을 적용할 수 있을 것 같아요)

이걸 어떻게 구현하면 될까요?

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    방법을 찾았어요. 제 Gleam 예제에서는 이렇게 했어요:

     list.fold(entries, "", fn(buffer, entry) -> String {
       buffer + "entry: " + int.to_string(entry) + " "
     })
    영어에서 번역원문 보기
  2. 고유 링크

    리스트를 받아 각 값마다 (???)를 만드는 함수

    함수형 언어에서는 보통 이 연산을 "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를 넣으면 "invalid 'end', insufficient scopes…

    답글 2최근 활동 lean-4
  2. 들어볼 만한 JavaScript 강좌가 있을까요?

    마지막으로 JavaScript 문서를 살펴본 게 1996년이었습니다. Elm과 포트를 자신 있게 쓸 수 있도록 “필수 JavaScript와 웹 개념”을 다루는 교육 강좌를 찾습니다. DOM을 이해하지 못하는 게 Elm 작업에…

    답글 2최근 활동 elmjavascript
  3. fmt와 main 패키지는 어디서 찾나요?

    많은 go 예제가 이렇게 시작합니다 : 제가 쓰는 GOPATH: main과 fmt 모듈은 어디에 저장되나요?

    답글 2최근 활동 go