기본적인 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)