1

当我进入 fs2 流操作的实现时,我经常在那里看到fromFreeCAlgebra使用。

究竟fromFreeCAlgebra做什么?为什么以及何时需要它们?

这是一个示例,一个 fs2 流操作eval,它评估效果并返回一个有效的流。

def eval[F[_], O](fo: F[O]): Stream[F, O] =
   fromFreeC(Algebra.eval(fo).flatMap(Algebra.output1))
4

1 回答 1

1

在 version 2.1.0、 classes PullStream和的源代码中,FreeC定义如下:

class FreeC[F[_], +O, +R]
class Pull[+F[_], +O, +R](free: FreeC[Nothing, O, R]) 
class Stream[+F[_], +O](free: FreeC[Nothing, O, Unit])

关键问题是Stream和在参数上Pull协变F[_]的,而FreeC是不变的。因此,您不能将F参数应用StreamPull直接应用到FreeC包装值的类型。为了弥补这一点,我们在这些字段中Nothing用作参数,并在 a和 a之间应用 use 转换,然后再返回。FreeCfreeasInstanceOfFreeC[Nothing, O, Unit]FreeC[F O, Unit]

然而,在这个拉取请求中,我们使类FreeC 协变F[_]就像Streamand一样Pull,所以我们可以定义:

class FreeC[+F[_], +O, +R]
class Pull[+F[_], +O, +R] (free: FreeC[F, O, R])
class Stream[+F[_], +O] (free: FreeC[F O, Unit])

因此,该fromFreeC功能被删除。这包含在 release 中2.2.0


的使用Nothing利用了 Scala-2 类型系统的特性:两者AnyNothing都是多类类型,因此它们可以用作 , , 等形式的类型参数的AF[_]A[_[_]]

于 2020-08-31T00:47:41.963 回答