如何使用Scala猫&x27;克莱斯利与其中之一
我试图使用Kleisli来编写返回单子的函数。它适用于以下选项:如何使用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
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]
注意?
来自种类投影仪