gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:07:09 25 4
gpt4 key购买 nike

我有一些使用 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 也没有更好,它只实现了一些来自 cats 的类型类。

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

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', 'b', '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, c), List(a, b), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, b, c), List(a, 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 上工作,因为两者都不提供正确的 cats (1.5.0) 和 monix (3.0.0-M3) 版本。

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

关于scala - 用猫创建抽象集合的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53629406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com