我正在尝试在 Scala 中使用记忆功能实现斐波那契函数
这里给出的一个例子使用了一个 case 语句: 在 Scala 中是否有一种通用的记忆方法?
import scalaz.Memo
lazy val fib: Int => BigInt = Memo.mutableHashMapMemo {
case 0 => 0
case 1 => 1
case n => fib(n-2) + fib(n-1)
}
Run Code Online (Sandbox Code Playgroud)
似乎该变量n被隐式定义为第一个参数,但是如果我替换n为_
此外,lazy关键字在这里有什么优势,因为该函数在使用和不使用此关键字的情况下似乎同样有效。
但是,我想将其概括为具有适当类型的更通用的函数定义
import scalaz.Memo
def fibonachi(n: Int) : Int = Memo.mutableHashMapMemo[Int, Int] {
var value : Int = 0
if( n <= 1 ) { value = n; }
else { value = fibonachi(n-1) + fibonachi(n-2) } …Run Code Online (Sandbox Code Playgroud) 我想知道 IO Monad 和 Reader monad 之间有什么关系吗?
Reader monad 中的环境可以产生效果吗?如果是这样,ZIO 或 Cats IO、scalaz-effects 如何处理 Reader Monad 原则?
我知道这完全是一个无意义的问题,但由于我对编程技能的文盲,这个问题浮现在我的脑海中。使用 Cats 和 scalaz,以便我们可以像 Haskell 那样以纯函数式编程方式在 Scala 中进行编码。但为了实现这一目标,我们需要在我们的项目中额外添加这些库。最终,为了使用它们,我们需要用它们的对象和函数来包装我们的代码。它是添加额外代码和依赖项的东西。我不知道这些是否会在内存中创建更大的对象。这些都让我思考。所以我的问题是:如果我使用 cats/scalaz ,我会面临任何性能问题,例如更多内存消耗吗?或者如果我的应用程序需要性能,我应该避免这些吗?
下划线中的下划线意味着什么.这是scalaz7库的片段:
trait Apply[F[_]] extends Functor[F] { self =>
//...
def ap[A, B](fa: => F[A])(f: => F[A => B]): F[B]
//...
def apF[A, B](f: => F[A => B]): F[A] => F[B] = ap(_)(f) // <----HERE
//...
}
Run Code Online (Sandbox Code Playgroud)
使用它的一般规则是什么?
如果我有
val incomingIds : List[Int] = ....
val existingIds : List[Int] = //this makes db calls and find existing records (only interested in returning ids)
Run Code Online (Sandbox Code Playgroud)
接下来我想incomingIds用existingIds以下方式进行比较
说我有
val incomingIds : List[Int] = List(2,3,4,5)
val existingIds : List[Int] = List(1,2,3,6)
Run Code Online (Sandbox Code Playgroud)
上面的示例建议我的API应该能够找到ids要删除的内容(存在于incomingIds但不存在的内容existingIds).在这个样本中existingIds有1,4,5但是它们不存在应该进入的incomingIds手段1,4,5
val idsForDeletion :List[Int]
Run Code Online (Sandbox Code Playgroud)
并会有另一个列表调用它
val idsForInsertion :List[Int].
Run Code Online (Sandbox Code Playgroud)
所以6应该进入idsForInsertion清单.
是否有一种简单的方法来分区列表这样的方式?
我对scalaz很新,我正试图将各种类型转换为monad变换器.
我坚持试图将a转换Int为a OptionT[Future, Int],甚至转换为EitherT[Future, String, Int].
我发现了一堆教程/ SO答案,解释了如何使用它point,但由于某种原因我无法编译它们.
例如,该段从这里:
1.point[({ type L[x] = EitherT[Future, String, x] })#L]
Run Code Online (Sandbox Code Playgroud)
错误:(9,9)找不到类型的证据参数的隐含值
scalaz.Applicative[[x]scalaz.EitherT[scala.concurrent.Future,String,x]]
另一个来自Scalaz Monad变形金刚
type Result[A] = OptionT[Future, A]
"".point[Result]
Run Code Online (Sandbox Code Playgroud)
错误:(8,10)找不到类型的证据参数的隐含值
scalaz.Applicative[A$A35.this.Result]
我相信这个应该也可以,但它说方法liftM不是以下成员Future[Int]:
1.point[Future].liftM[OptionT] //doesnt compile
1.point[List].liftM[OptionT] //compiles
Run Code Online (Sandbox Code Playgroud)
所有这些示例都失败了,但是如果我替换Future,比如说,它们会编译List.现在,这是对我有用的唯一方式,但它有点冗长 - 我真的希望能够使用point:
OptionT(Future.successful(1.some))
Run Code Online (Sandbox Code Playgroud)
为什么这不编译?Future在最近的版本中,应用/ monad是否已从scalaz中移除?
我正在使用scala 2.11.7和scalaz 7.1.3.对于它的价值,这些是我的进口:
import scala.concurrent.Future
import scalaz._
import Scalaz._
Run Code Online (Sandbox Code Playgroud) 在scala中,如何创建通用函数来执行以下操作:
f: List[A] ==> List[Option[A]]
我在DSL中使用monad和comprenhension工作.由于我的客户端不知道Scala我试图隐藏这么多语法.到目前为止我有这个DSL
(for {
* <- Given("A message", message(path = "esb", version = TWO))
* <- And("With version 2.0", *)
* <- And("I make esb return 300", *)
* <- When("I make a request", *)
* <- Then("The return code is 500", *)
} yield ()).foldMap(scenario)
Run Code Online (Sandbox Code Playgroud)
这比使它们实现scalaTest要好得多,但这仍然可以吓到它们.
有没有办法隐藏使用隐式u其他机制的for/yield而只是离开DSL?
问候.
我有一个非常大val s: List[Int] = //...,一个功能f: Int => Boolean和一个功能transform: Int => Int.
问题:我想创造另一个List[Int],使得所有元素e: Int的的s: List[Int],这样f(e) = true与更换transform(e).
我看了一下cats-mtl FunctorEmpty(坚持函数编程风格),但它似乎不适用于我的情况.也许某些cats/ scalaz数据结构在这里有用吗?还是其他任何方式?
我正在尝试与期货的收集工作,并且无法根据未来状态从def返回结果。下面是我的代码:
final case class StagesToRun(stages : Set[StageRun])
private def processNextStagesAndAccumulateResults(stagesToRun: StagesToRun): \/[Exception, Success] = {
val stageProcessingExceptions = mutable.Set[Exception]()
//processor.process(stagesToRun) => returns a Set[Future[\/[Exception, Success]]] and I am converting it to Future[Set[\/[Exception, Success]]] in below expression
val processResults = Future.sequence(processor.process(stagesToRun))
processResults.onSuccess {
case result => {
result.map { res =>
res.fold(
l => stageProcessingExceptions += l,
r => r
)
}
if (stageProcessingExceptions.isEmpty) Success.right
else new Exception("Got exception while processing one of the stage").left
}
}
processResults.onFailure {
case ex …Run Code Online (Sandbox Code Playgroud) scalaz ×10
scala ×9
scala-cats ×4
list ×2
scalaz7 ×2
cats-effect ×1
collections ×1
fibonacci ×1
lifting ×1
memoization ×1
wildcard ×1
zio ×1