如何将函子与scala/cats一起使用
阿罗哈!:) 有人能给我指一个有用的scala/cats教程吗? 在过去的几天里,我一直在努力制作一个类a函子,我准备在我的显示器上打一个洞。 到目前为止,我找到的所有文档对我都没有帮助 也许我应该试试=D 这是我想变成函子的类。 此外,“秀”的表现也不符合我的预期如何将函子与scala/cats一起使用,scala,scala-cats,Scala,Scala Cats,阿罗哈!:) 有人能给我指一个有用的scala/cats教程吗? 在过去的几天里,我一直在努力制作一个类a函子,我准备在我的显示器上打一个洞。 到目前为止,我找到的所有文档对我都没有帮助 也许我应该试试=D 这是我想变成函子的类。 此外,“秀”的表现也不符合我的预期 package org.hudelundpfusch.utilites.decisions.data import cats.{Functor, Show} import cats.kernel.Eq import cats.sy
package org.hudelundpfusch.utilites.decisions.data
import cats.{Functor, Show}
import cats.kernel.Eq
import cats.syntax.functor._
import cats.syntax.show._
import scala.reflect.runtime.universe
import scala.reflect.runtime.universe._
case class Fact[T <: Any] (name: String, value: T) (implicit private val paramTypeTagT: WeakTypeTag[T])
extends Equals {
val paramType: universe.Type = paramTypeTagT.tpe
val paramTypeClass: Option[Class[_ <: T]] = if (value != null) {
Some(value.getClass)
} else {
None
}
def map[A, B](fa: Fact[A])(f: A => B): Fact[B] = Fact[B](fa.name, f(fa.value))
override def canEqual(other: Any): Boolean = other.isInstanceOf[Fact[_]]
override def equals(other: Any): Boolean = other match {
case that: Fact[_] =>
(that canEqual this) &&
name == that.name
paramType == that.paramType &&
paramTypeClass == that.paramTypeClass &&
value == that.value
case _ => false
}
override def hashCode(): Int = {
val state = Seq(name, paramType, paramTypeClass, value)
state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
}
override def toString = s"Fact(name=${name}, paramType=$paramType, paramTypeClass=$paramTypeClass, value=$value)"
}
case object Fact extends Show[Fact[_]] {
override def show(t: Fact[_]): String = t.toString
}
不幸的是,对映射函数的调用看起来有点麻烦:
package org.hudelundpfusch.utilites.decisions.data
object Fuddel {
def main(args: Array[String]): Unit = {
val fact1: Fact[Int] = Fact("Fact-1", 23)
val fact2 = Fact.factFunctor.map(fact1){x: Int => x * 2}
println(s"$fact2")
}
}
对于猫,您不扩展Show,Functor特性(OOP方式),而是创建Show,Functor(FP方式)的隐式实例
以防万一,
Fact[\u]
在您的案例中,对象事实扩展Show[Fact[\u]]
是存在类型,而Fact
在我的中,隐式对象factFunctor extends Functor[Fact]
是更高级的类型。它似乎编译得很好。你的问题是什么?你好Andrey谢谢你的回答。我忘了提到我想让这个类扩展cat的函子,并把必要的映射函数放在一个伴随对象中。我希望我能够调用带有中缀注释的映射函数,比如:fact:fact[Int]=someFact-map-someFunction
唉,它不起作用了。。。也许我太笨了=(向AlexWell致意……如果您想扩展Functor,这不是问题。如果您确实试图实现Functor,但它不起作用,那么这将是一个问题。目前,除了one import子句外,我没有看到任何关于Functor
的提及。请提供一个示例,说明实际问题是什么。刚刚更新我的问题…也许现在更清楚了一点…在这种情况下,Dmytro Mitin似乎正确地猜到了你的问题。问题已经更新,似乎它在问你的答案。因果关系?发生在关系之前?不,从来没有听说过这一点…这里有两件事要告诉广告。1.不要使用隐式对象,它们有时会出现中断隐式解析,请始终使用隐式val和显式类型签名(隐式val factFuntor:Functor[Fact]=新Functor[Fact]{…}
).-2.澄清一下,这不是一个cats问题,它是typeclass模式的本质。您的类不再是F
。但是,它确实有一个F
的实例。诀窍在于区分is a和has a。@AlexanderSchell,如上所述:您缺少导入cats.syntax.functor.\u
。导入后,您应该能够编写fact1.map(*2)
@AlexanderSchell哈,什么?不。如果这解决了您的问题,请将答案标记为已接受的答案。如果您认为评论部分的内容应复制到答案中,请告诉我们,我们可以编辑任何内容。或者建议您自己编辑(我不知道,也许这在某些阈值下不起作用。)@LuisMiguelMejíaSuárez这里有一个例子,隐式对象起作用,隐式val不起作用,这里有一个例子,你不能用任何类型注释隐式m
,这样代码就可以编译了
object Fact {
implicit val factFunctor: Functor[Fact] = new Functor[Fact] {
override def map[A, B](fa: Fact[A])(f: A => B): Fact[B] = Fact[B](fa.name, f(fa.value))
}
implicit def factShow[T]: Show[Fact[T]] = new Show[Fact[T]] {
override def show(t: Fact[T]): String = this.toString
}
}
package org.hudelundpfusch.utilites.decisions.data
object Fuddel {
def main(args: Array[String]): Unit = {
val fact1: Fact[Int] = Fact("Fact-1", 23)
val fact2 = Fact.factFunctor.map(fact1){x: Int => x * 2}
println(s"$fact2")
}
}
implicit def factShow[T]: Show[Fact[T]] = new Show[Fact[T]] {
override def show(t: Fact[T]): String = ???
}
// implicit object factFunctor extends Functor[Fact] {
// override def map[A, B](fa: Fact[A])(f: A => B): Fact[B] = ???
// }
implicit val factFunctor: Functor[Fact] = new Functor[Fact] {
override def map[A, B](fa: Fact[A])(f: A => B): Fact[B] = ???
}
Show[Fact[Int]].show(Fact("a", 1))
Functor[Fact].map(Fact("a", 1))(_ + 1)
import cats.syntax.show._
Fact("a", 1).show
import cats.syntax.functor._
Fact("a", 1).map(_ + 1)