scala with cats 之 Contravariant Functors and Invariant Functors

本文介绍了Scala中Contravariant Functors和Invariant Functors的概念及用法。Contravariant Functors允许从B到A的函数转换F[B]到F[A],在类型类和转换实例中具有应用。示例展示了如何利用contramap实现类型转换。而Invariant Functors常见于数据库交互,如Slick和Quill,用于将case class与数据库字符串互相转换。文中还讨论了抽象Codec[A]接口,以及如何添加内置实例和自定义case class实例。
摘要由CSDN通过智能技术生成

Contravariant Functors

概述

Functor的意思是,如果有个F[A]和函数A=>B,那么就能得到一个F[B]。而Contravariant Functors的意思是,如果有个F[B],然后有个函数A => B,那我们就能得到一个F[A]。
在这里插入图片描述

用途

假如我们有个类型类,比如说

trait Semigroup[A]{
   
	def combine(x:A,y:A):A
}

我们经常要定义各种实例,比如Semigroup[Int],Semigroup[String],比如Semigroup[Boolean]。这些都是cats内置的实例。如果我们自己有个类型Box,我们要自己定义Semigroup[Box]实例。可是自己定义实例实在太麻烦,能不能根据现有的实例转化成新的实例呢?当然是是可以的。

示例

还是拿cats里面的例子讲解。
先定义类型类,然后给个contramap实现:

trait Printable[A] {
   
  def format(value: A): String
  
  def contramap[B](func: B => A): Printable[B] =
  new Printable[B] {
   
    def format(value: B): String =
      self.format(func(value))
  }
}

理论上contramap并不是Printable本身的能力,其实应该属于Contravariant[F[_]]的能力。所以单独实现一个Contravariant[Printable]实例比较好,类似下面的Contravariant[Show]:

  implicit val catsContravariantForShow: Contravariant[Show] = new Contravariant[Show] {
   
    def contramap[A, B](fa: Show[A])(f: B 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值