學習軌道
/
Unison
Unison
/
練習
/
串流操作
串流操作

串流操作

中等

說明

實作基本的 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 能力

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)
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Unison Exercism

準備好開始 串流操作 了嗎?

註冊 Exercism,透過 53 個練習 和真人引導來學習並精通 Unison,全部免費。