【问题标题】:Scala cats. How do I write Kleisli[F[_],A,B].ap?斯卡拉猫。如何编写 Kleisli[F[_],A,B].ap?
【发布时间】:2022-06-15 20:34:55
【问题描述】:

我试图写一个Kleisli.ap函数。

final case class Kleisli[F[_], -A, B](run: (A) ⇒ F[B]) extends Product with Serializable

def ap[C, D, AA <: A](f: Kleisli[F, AA, C])(implicit F: Apply[F], ev: As[B, (C) ⇒ D]): Kleisli[F, AA, D]

但是

import cats._
import cats.implicits._
import cats.data._

val x: Kleisli[Option,String,Int] = Kleisli(_ => Some(1))
val y: Kleisli[Option,String,Double] = Kleisli(_ => Some(1.0))

val kleisliAp: Kleisli[Option,String,Double] = x.ap(y)
// No implicits found for parameter ev: As[Int, Double => D_]

我看到了这个错误代码并寻找一种方法来创建 As[A,B] 的实例,但找不到。
如果您知道如何解决此问题,请告诉我。

【问题讨论】:

  • cats ap 函数具有以下签名:def ap[C, AA &lt;: A](f: Kleisli[F, AA, B =&gt; C])(implicit F: Apply[F]): Kleisli[F, AA, C]。如果 y 的定义类似于:val y: Kleisli[Option,String, Int =&gt; Double] = Kleisli(_ =&gt; Option(_.toDouble)),则这可以用作 x.ap(y)

标签: scala scala-cats cats-effect


【解决方案1】:

ap 是组合您拥有的两个对象的错误方式。

ap 需要 F[A]F[A =&gt; B]。你有一个F[A] 和一个F[B]

改为使用mapN

(x, y).mapN { (int, double) =&gt; ??? }


此外,ap 在 scala FP 中被认为是不好的样式。它的形状真的不适合scala;它存在是因为它是 Apply 基础的一部分,但 mapN 是应用组合对象的惯用方式

【讨论】:

    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多