作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码应该采用函数 A => Boolean
(输入类型的泛型)并将其转换为泛型特征 Y[A]
通过链式隐式转换:
val f: Int => Boolean = ???
trait X[A] {
def m1: Unit
}
implicit def toX[A](f: A => Boolean): X[A] = ???
f.m1 // Works
trait Y[A] {
def m2: Unit
}
implicit def toY[T, A](x: T)(implicit toX: T => X[A]): Y[A] = ???
f.m2 // Won't compile
X
非通用 Y
非通用 Int => A
)Option[A]
, Seq[A]
或 Array[A]
X[A]
和
Y[A]
)是通用的。
Option[A]
、
Seq[A]
、
A
等)。为了实现这一点,我们的想法是拥有
toX
的版本。将这些类型中的每一种转换为
X[A]
的函数.那么只有一个版本
toY
是需要的。
最佳答案
我想我有一个解决你的问题的方法,看看下面的代码:
val f: Int => Boolean = _ => true
trait X[A] {
def m1: Unit
}
implicit def funcToX[A](f: A => Boolean): X[A] = new X[A] {
override def m1: Unit = println("Hello x")
}
f.m1 // Works
trait Y[A] {
def m2: Unit
}
implicit def toY[T[_,_], A](x: T[A, Boolean])(implicit toX: T[A, Boolean] => X[A]): Y[A] = new Y[A] {
override def m2: Unit = {
x.m1
println("Hello y")
}
}
f.m2 // now works
implicit def toY[A](x: A => Boolean)(implicit toX: (A => Boolean) => X[A]) = ???
type SingleGenericFun[T] = T => _
val f: SingleGenericFun[Int] = _ > 42
val g: Int = 42
trait X[A] {
def m1: Unit
}
implicit def toX(f: SingleGenericFun[Int]): X[Int] = ???
implicit def toX(x: Int): X[Int] = new X[Int] {
override def m1: Unit = println(x)
}
f.m1 // Works
trait Y[A] {
def m2: Unit
}
implicit def toY2[T[_, _], A](x: T[A, _])(implicit toX: T[A, Boolean] => X[A]): Y[A] = new Y[A] {
override def m2: Unit = {
x.m1
println("Hello y!")
}
}
implicit def toY0[A](x: A)(implicit toX: A => X[A]): Y[A] = new Y[A] {
override def m2: Unit = {
x.m1
println("Hello y!")
}
}
implicit def toY1[T[_], A](x: T[A])(implicit toX: T[A] => X[A]): Y[A] = new Y[A] {
override def m2: Unit = {
x.m1
println("Hello y")
}
}
g.m2
f.m2 // Compile
关于scala - 将函数的隐式转换链接到泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771776/
我是一名优秀的程序员,十分优秀!