作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如问题所说,我正在尝试以下操作(不编译):
object O {
def apply(i: Int): Boolean = i % 2 == 0
}
val f: Int => Boolean = O
所以我试了一下:
implicit def apply2Fct[A,B](applier: { def apply(a: A): B }) = {
new Function[A,B] { def apply(a: A): B = applier(a) }
}
但是编译器提示“结构细化中的参数类型可能不引用在该细化之外定义的抽象类型”。
编辑:
由于 Jean-Philippe Pellet 的回答,我不得不提到我不能让 O
扩展 Function[A,B]
分别为 Function[Int,Boolean]
。
最佳答案
由于 Gilles 在 ticket #967 上给出的原因,您不能直接这样做.有问题的构造是外部定义的类型参数 A 在结构类型中的方法定义的裸参数位置出现。
但是,我们可以通过消除有问题的出现来近似期望的结果,以支持内部类型参数和类型约束,强制它在应用该方法的任何点都等于原始参数类型 A。
为此,您必须修改您尝试从结构上捕获的方法签名的一般形式(nb。伪代码如下),
def method(x : <<your arg type>>) : <<your result type>>
到
def method[T](x : T)(implicit ev : T =:= <<your arg type>>) : <<your result type>>
对于您的特殊情况,我们需要类似以下内容,
object O {
def apply[T](i : T)(implicit ev : T =:= Int) : Boolean = i % 2 == 0
}
implicit def apply2Fct[A,B](applier: { def apply[T](a: T)(implicit ev : T =:= A): B }) = {
new Function[A,B] { def apply(a: A): B = applier(a) }
}
示例 REPL session ,
scala> implicit def apply2Fct[A,B](applier: { def apply[T](a: T)(implicit ev : T =:= A): B }) = {
| new Function[A,B] { def apply(a: A): B = applier(a) }
| }
apply2Fct: [A, B](applier: AnyRef{def apply[T](a: T)(implicit ev: =:=[T,A]): B})java.lang.Object with (A) => B
scala> object O {
| def apply[T](i : T)(implicit ev : T =:= Int) : Boolean = i % 2 == 0
| }
defined module O
scala> O(23)
res0: Boolean = false
scala> O(24)
res1: Boolean = true
scala> val f: Int => Boolean = O
f: (Int) => Boolean = <function1>
scala> f(23)
res2: Boolean = false
scala> f(24)
res3: Boolean = true
关于scala - 如何使用适当的 apply 方法将对象隐式转换为函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5934902/
这段代码在 Java 中的等价物是什么?我放了一部分,我对 I/O 部分感兴趣: int fd = open(FILE_NAME, O_WRONLY); int ret = 0; if (fd =
我正在尝试将维度为 d1,d2,d3 的张量 M[a1,a2,a3] reshape 为维度为 d2, d1*d3 的矩阵 M[a2,a1*a3]。我试过 M.reshape(d2,d1*d3) 但是
我是一名优秀的程序员,十分优秀!