加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 用猫创建抽象集合的有效方法

发布时间:2020-12-16 18:32:12 所属栏目:安全 来源:网络整理
导读:我有一些代码使用 Monix Observable 进行文件的流处理.为了测试这段代码,我希望我在Observable上做的操作是独立于类型的,所以我也可以在任何其他数据结构上执行它们,比如List.这就是我编写以下代码来抽象底层数据结构的原因: def permutations[F[_] : Appli
我有一些代码使用 Monix Observable进行文件的流处理.为了测试这段代码,我希望我在Observable上做的操作是独立于类型的,所以我也可以在任何其他数据结构上执行它们,比如List.这就是我编写以下代码来抽象底层数据结构的原因:

def permutations[F[_] : Applicative : FunctorFilter : SemigroupK](chars: F[Char]): F[F[Char]] = {
  Range.inclusive('a','z').map(_.toChar)
    .map { c ?
      FunctorFilter[F].filter(chars)(Character.toLowerCase _ andThen (_ != c))
    }
    .map(Applicative[F].pure)
    .reduceLeft(SemigroupK[F].combineK)
}

让我烦恼的是,这段代码创建了许多中间数据结构.是否有我可以使用的类型类使这个过程更有效?将一个数据结构提升到另一个数据结构而没有太多开销的东西,比如LiftIO但是对于项目集合?

解决方法

看起来猫并没有为此提供任何东西. monix并不是更好,它只实现了一些来自猫的类型.

所以,我最好的猜测是自己定义这样的类型类:

import monix.execution.Scheduler.Implicits.global
import cats._
import cats.implicits._
import monix.reactive._

object Test {

  def main(args: Array[String]): Unit = {

    println(permutations(List('a','b','c')))

    permutations(Observable('a','c')).foreach{c =>
      print("Observable(")
      c.foreach(c1 => print(c1 + " "))
      print(") ")
    }
  }

  def permutations[F[_] : Applicative](chars: F[Char])(implicit seq: Sequence[F],fil: Filter[F]): F[F[Char]] = {

    val abc = seq.fromIterable(
      Range.inclusive('a','z').map(_.toChar)
    )

    abc.map(c => fil.filter(chars)(_ != c))
  }

  trait Sequence[F[_]] {

    def fromIterable[A](f: Iterable[A]): F[A]
  }

  implicit val listSequence: Sequence[List] = new Sequence[List] {

    def fromIterable[A](f: Iterable[A]): List[A] = f.toList
  }

  implicit val observableSequence: Sequence[Observable] = new Sequence[Observable] {

    def fromIterable[A](f: Iterable[A]): Observable[A] = Observable.fromIterable(f)
  }

  trait Filter[F[_]] {

    def filter[A](fa: F[A])(f: A => Boolean): F[A]
  }

  implicit val observableFilterFunctor: Filter[Observable] = new Filter[Observable] {

    def filter[A](fa: Observable[A])(f: A => Boolean): Observable[A] =
      fa.filter(f)
  }

  implicit val listFilterFunctor: Filter[List] = new Filter[List] {

    def filter[A](fa: List[A])(f: A => Boolean): List[A] =
      fa.filter(f)
  }

}

结果:

List(List(b,c),List(a,b),b,c))
Observable(b c ) Observable(a c ) Observable(a b ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c ) Observable(a b c )

遗憾的是,我无法将其用于scalafiddle或scastie,因为它们都没有提供正确的猫(1.5.0)和monix(3.0.0-M3)版本.

我仍然希望这会有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读