gpt4 book ai didi

scala - 如何使用适当的 apply 方法将对象隐式转换为函数?

转载 作者:行者123 更新时间:2023-12-04 19:56:11 28 4
gpt4 key购买 nike

正如问题所说,我正在尝试以下操作(不编译):

  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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com