В исходном коде версии 2.1.0
классы Pull
, Stream
и 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
параметр Stream
или Pull
непосредственно к FreeC
типу обернутого значения. Чтобы решить эту проблему, мы использовали Nothing
в качестве аргумента для FreeC
в этих free
полях и применили asInstanceOf
преобразования между FreeC[Nothing, O, Unit]
в FreeC[F O, Unit]
и обратно.
Однако в этом запросе на слияние мы сделали класс FreeC
ковариантным em > на F[_]
, точно так же, как Stream
и 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
была отброшена. Это было включено в выпуск 2.2.0
.
При использовании Nothing
используется функция системы типов Scala-2: и Any
, и Nothing
являются поликодированными типами, поэтому их можно применять в качестве аргументов для параметров типа формы A
, F[_]
, A[_[_]]
и т. Д.
person
Diego E. Alonso-Blas
schedule
31.08.2020
fs2
участник. - person Luis Miguel Mejía Suárez   schedule 31.01.2020