Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Scala猫&x27;克莱斯利与其中之一_Scala_Scala Cats_Either_Kleisli - Fatal编程技术网

如何使用Scala猫&x27;克莱斯利与其中之一

如何使用Scala猫&x27;克莱斯利与其中之一,scala,scala-cats,either,kleisli,Scala,Scala Cats,Either,Kleisli,我试图使用Kleisli来编写返回单子的函数。它适用于以下选项: import cats.data.Kleisli import cats.implicits._ object KleisliOptionEx extends App { case class Failure(msg: String) sealed trait Context case class Initial(age: Int) extends

我试图使用Kleisli来编写返回单子的函数。它适用于以下选项:

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

object KleisliOptionEx extends App {
  case class Failure(msg: String)
  sealed trait Context
  case class Initial(age: Int)                                   extends Context
  case class AgeCategory(cagetory: String, t: Int)                    extends Context
  case class AgeSquared(s: String, t: Int, u: Int)             extends Context

  type Result[A, B] = Kleisli[Option, A, B]
  val ageCategory: Result[Initial,AgeCategory] =
    Kleisli {
      case Initial(age) if age < 18 => {
        Some(AgeCategory("Teen", age))
      }
    }

  val ageSquared: Result[AgeCategory, AgeSquared] = Kleisli {
      case AgeCategory(category, age) =>  Some(AgeSquared(category, age, age * age))
    }

  val ageTotal = ageCategory andThen ageSquared
  val x = ageTotal.run(Initial(5))
  println(x)
}
导入cats.data.Kleisli
进口猫_
对象KleisliOptionEx扩展应用程序{
案例类失败(消息:字符串)
封闭特征语境
case类Initial(age:Int)扩展了上下文
case类AgeCategory(cagetory:String,t:Int)扩展了上下文
case类AgeSquared(s:String,t:Int,u:Int)扩展了上下文
类型结果[A,B]=Kleisli[Option,A,B]
val ageCategory:结果[初始值,ageCategory]=
克莱斯利{
如果年龄<18=>{
一些(年龄类别(“青少年”,年龄))
}
}
val ageSquared:Result[AgeCategory,ageSquared]=Kleisli{
案例年龄类别(类别,年龄)=>部分(年龄平方(类别,年龄,年龄*年龄))
}
val ageTotal=年龄类别和年龄平方
val x=年龄总计。运行(初始值(5))
println(x)
}
但是我也不能和一个…一起工作

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

object KleisliEx extends App {
  case class Failure(msg: String)

  sealed trait Context
  case class Initial(age: Int)                                   extends Context
  case class AgeCategory(cagetory: String, t: Int)                    extends Context
  case class AgeSquared(s: String, t: Int, u: Int)             extends Context

  type Result[A, B] = Kleisli[Either, A, B]

  val ageCategory: Result[Initial,AgeCategory] =
    Kleisli {
      case Initial(age) if age < 18 => Either.right(AgeCategory("Teen", age))
    }

  val ageSquared : Result[AgeCategory,AgeSquared] = Kleisli {
      case AgeCategory(category, age) =>  Either.right(AgeSquared(category, age, age * age))
    }

  val ageTotal = ageCategory andThen ageSquared
  val x = ageTotal.run(Initial(5))

  println(x)
}
导入cats.data.Kleisli
进口猫_
对象KleisliEx扩展应用程序{
案例类失败(消息:字符串)
封闭特征语境
case类Initial(age:Int)扩展了上下文
case类AgeCategory(cagetory:String,t:Int)扩展了上下文
case类AgeSquared(s:String,t:Int,u:Int)扩展了上下文
类型结果[A,B]=Kleisli[A,B中的任意一个]
val ageCategory:结果[初始值,ageCategory]=
克莱斯利{
如果年龄<18岁=>则为病例首字母(年龄)。对(年龄类别(“青少年”,年龄))
}
val ageSquared:Result[AgeCategory,ageSquared]=Kleisli{
case AgeCategory(category,age)=>one.right(AgeSquared(category,age,age*age))
}
val ageTotal=年龄类别和年龄平方
val x=年龄总计。运行(初始值(5))
println(x)
}

我猜两者都有两个类型参数,Kleisle包装器需要一个输入和一个输出类型参数。我不知道我如何才能对Orther…

隐藏左侧类型,因为您正确地指出问题在于,
Orther
接受两个类型参数,而Kleisli希望类型构造函数只接受一个。 我建议你看看这个插件,因为它解决了你的问题

您可以通过以下几种方式解决此问题:

如果
中的错误类型始终相同,您可以执行以下操作:

    sealed trait MyError
    type PartiallyAppliedEither[A] = Either[MyError, A]
    type Result[A, B] = Kleisli[PartiallyAppliedEither, A, B]
    // you could use kind projector and change Result to
    // type Result[A, B] = Kleisli[Either[MyError, ?], A, B]
如果需要更改错误类型,您可以让您的
结果
类型改为使用3个类型参数,然后采用相同的方法

type Result[E, A, B] = Kleisli[Either[E, ?], A, B]
注意
来自
种类投影仪