轨道
/
Unison
Unison
/
练习
/
流操作
流操作

流操作

中等

说明

实现Stream能力的基本操作。

在函数式语言里,像filter、map和reduce这样的函数非常常见。请在不使用现有函数的情况下,为流能力实现一系列基本的函数式组合子。为此,你需要自己编写能力处理器。

💡 为了避免与标准库中现有的Stream能力冲突,我们把这个能力叫作MyStream。

你需要实现的操作有:

  • MyStream.fromList(给定一个元素列表,创建一个元素流)
  • MyStream.toList(给定一个元素流,把它转换为列表)
  • MyStream.toListWithResult(给定一个元素流,把它和流函数的结果一起转换为列表)
  • MyStream.ignore(给定一个元素流,忽略产出的值,返回流函数的结果)
  • MyStream.filter(给定一个谓词和一个MyStream,返回一个MyStream,其中包含所有使predicate(item)为真的项)
  • MyStream.map(给定一个函数和一个MyStream,返回一个MyStream,其中包含对每一项应用function(item)所得的结果)
  • MyStream.flatMap(给定一个产生MyStream的函数和一个MyStream,返回一个MyStream,其中包含对每一项应用function(item)所得的结果)

关于 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 handler,把 Stream 具体化为 List,并同时拿到产生它的那个函数的返回值:

> Stream.toListWithResult! emitRunningTotal
  ⧩
  ([1, 3, 5, 7, 9], 5)
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Unison Exercism

准备好开始 流操作 了吗?

注册 Exercism,借助 53 个练习 和真人导师指导,学习并掌握 Unison,全部免费。