Scala无法在scalaz或猫中进行pimp NaturalTransformation

问题描述 投票:0回答:1

由于某种原因,以下无法正常工作

object NtExtTest {
  implicit class NaturalTransformExt[M[_], N[_]](val self: NaturalTransformation[M,N]) extends AnyVal {
    def test(b:Boolean) = b
  }
 }

当我在自然变换上调用方法test时。 Intellij将其识别为扩展函数,但编译提供了value test is not a member of cats.~>。使用scalaz NaturalTransformation时会发生同样的情况。有什么我可以帮助编译识别扩展吗?

Scala版本是2.11.8

失败的一个例子:

  import NtExtTest._

  class NtTest[B] extends NaturalTransformation[Either[B,?], Xor[B,?]] {
    def apply[A](fa: Either[B, A]): Xor[B, A] = {
      fa match {
        case Left(l) => Xor.left(l)
        case Right(r) => Xor.right(r)
      }
    }
  }

  val test = new NtTest[String]
  test.test(false)

(上面使用了类型的投影机插件,但同样失败了类型lambdas,或单个param更高的kinded类型)

scala scalaz scala-cats kind-projector
1个回答
0
投票

可能与SI-8286有关

object NtExtTest {
  // this will work
  implicit class NatTransExt1[E](val t: NaturalTransformation[Either[E, ?], \/[E, ?]]) {
    def test1(b: Boolean): Boolean = false
  }

  // and this will work
  implicit class NatTransExt2[E](val t: NtTest[E]) {
    def test2(b: Boolean): Boolean = false
  }

  // but this will not work, because NaturalTransformation[F, G] and
  // NaturalTransformation[Either[E, ?], \/[E, ?]] of different kind
  implicit class NatTransExt3[F[_], G[_]](val s: NaturalTransformation[F, G]) {
    def test3(b: Boolean): Boolean = false
  }
}

即它与NaturalTransformation无关。它在简单的情况下也不起作用:

trait SomeType[F[_]]

class SomeConcreteType[A] extends SomeType[Either[A, ?]]

object SomeTypeExt {
  // this will not compile
  implicit class SomeTypeEnrich[F[_]](val t: SomeType[F]) {
    def test1: Boolean = false
  }
  // this will
  implicit class SomeConcreteEnrich[A](val t: SomeType[Either[A, ?]]) {
    def test2: Boolean = true
  }
}

如果延长NtTest的目标,可能NatTransExt1将是最好的选择,如果你想保持尽可能通用。 NatTransExt2是好的,如果扩展真的特定于NtTest

© www.soinside.com 2019 - 2024. All rights reserved.