实现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 abilityStream 是 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)