實作基本的 Stream 能力操作。
在函式式語言中,filter、map、reduce 這類函式非常常見。請為串流能力實作一系列基本的函式式組合子,過程中不要使用現有的函式。你需要為此自行撰寫能力處理常式。
💡 為了避免與標準函式庫中現有的 Stream 能力衝突,我們把這個能力取名為 MyStream。
你需要實作的操作有:
MyStream.fromList(給定一個元素陣列,建立一個元素串流)MyStream.toList(給定一個元素串流,將它具體化為陣列)MyStream.toListWithResult(給定一個元素串流,將它具體化為陣列,同時取得串流函式的結果)MyStream.ignore(給定一個元素串流,忽略送出的值,回傳串流函式的結果)MyStream.filter(給定一個述詞和一個 MyStream,回傳所有 predicate(item) 為 true 的項目所構成的 MyStream)MyStream.map(給定一個函式和一個 MyStream,回傳對所有項目套用 function(item) 的結果所構成的 MyStream)MyStream.flatMap(給定一個會產生 MyStream 的函式和一個 MyStream,回傳對所有項目套用 function(item) 的結果所構成的 MyStream)Stream是一種 Unison 能力,用來發出值。
如果你的函式在被呼叫時,需要順帶產生一些值,就可以使用Stream能力喔。例如,下面這個函式會回傳陣列的最後一個值,但每看到一個元素就會發出目前的累計總和:
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]
我們可以用能力處理器,把 Stream 具體化成陣列,連同產生它的函式回傳值一起取出:
> Stream.toListWithResult! emitRunningTotal
⧩
([1, 3, 5, 7, 9], 5)