트랙
/
Unison
Unison
/
연습 문제
/
스트림 연산
스트림 연산

스트림 연산

보통

지침

기본적인 Stream ability 연산을 구현해요.

함수형 언어에서는 filter, map, reduce 같은 함수가 아주 흔해요. 기존 함수를 쓰지 않고 스트림 ability를 위한 기본적인 함수형 컴비네이터를 구현해 봐요. 그러려면 ability 핸들러를 직접 작성해야 해요.

💡 표준 라이브러리에 이미 있는 Stream ability와 충돌하지 않도록, 이 ability를 MyStream이라고 부를게요.

구현해야 할 연산은 다음과 같아요:

  • MyStream.fromList (주어진 요소 목록으로 요소의 스트림을 만들어요)
  • MyStream.toList (주어진 요소의 스트림을 목록으로 만들어요)
  • MyStream.toListWithResult (주어진 요소의 스트림을, 스트림 함수의 결과와 함께 목록으로 만들어요)
  • MyStream.ignore (주어진 요소의 스트림에서 방출된 값은 무시하고, 스트림 함수의 결과를 반환해요)
  • MyStream.filter (주어진 술어와 MyStream에 대해, predicate(item)이 참인 모든 항목의 MyStream을 반환해요)
  • MyStream.map (주어진 함수와 MyStream에 대해, 모든 항목에 function(item)을 적용한 결과의 MyStream을 반환해요)
  • MyStream.flatMap (MyStream을 만드는 함수와 MyStream이 주어지면, 모든 항목에 function(item)을 적용한 결과의 MyStream을 반환해요)

Stream ability 알아보기

Stream은 값을 내보내는 데 사용하는 Unison의 ability예요.

함수가 호출되는 동안 부수적인 효과로 값을 내보내야 할 때 Stream ability를 사용할 수 있어요. 예를 들어, 다음 함수는 배열의 마지막 값을 반환하지만, 원소를 하나씩 볼 때마다 누적 합계를 내보내요:

emitRunningTotal : '{Stream Nat} Nat
emitRunningTotal = 'let
  use Nat +
  List.foldLeft (
    acc a -> let
      runningTotal = acc + a
      Stream.emit runningTotal
      a
    ) 0 [1,2,3,4,5]

ability 핸들러를 사용하면, 이 함수가 반환하는 값과 함께 Stream을 List로 만들어 낼 수 있어요:

> Stream.toListWithResult! emitRunningTotal
  ⧩
  ([1, 3, 5, 7, 9], 5)
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Unison Exercism

스트림 연산 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Unison 트랙을 연습 문제 53개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.