如何将函子与scala/cats一起使用

如何将函子与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

阿罗哈!:)

有人能给我指一个有用的scala/cats教程吗? 在过去的几天里,我一直在努力制作一个类a函子,我准备在我的显示器上打一个洞。 到目前为止,我找到的所有文档对我都没有帮助

也许我应该试试=D

这是我想变成函子的类。 此外,“秀”的表现也不符合我的预期

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)