gpt4 book ai didi

scala - Lambda 类型推断和隐式转换

转载 作者:行者123 更新时间:2023-12-02 16:40:03 28 4
gpt4 key购买 nike

我定义了以下类:

class TransparentFunction1[-T1, +R1](val func : T1 => R1, val text : String) {
@inline
def apply(t : T1) = func(t)

override def toString = text
}

基本上,TransparentFunction1 只是一个 Function1 的包装器,它提供了一个人类可读的文本字段来描述该函数的含义。

我想定义一个隐式转换,可以将任何 Function1 转换为 TransparentFunction1,并将函数的代码传递给文本参数。

我已经使用宏定义了这样的隐式转换:

  implicit def transparentFunction1[T1, R1](expression : T1 => R1) : TransparentFunction1[T1, R1] = macro Macros.transparentImpl[T1, R1, TransparentFunction1[T1, R1]]

object Macros {
def transparentImpl[T : context.WeakTypeTag, U : context.WeakTypeTag, V : context.WeakTypeTag](context : scala.reflect.macros.whitebox.Context) (expression : context.Expr[T => U]) : context.Expr[V] = {
import context.universe._
context.Expr[V](
Apply(
Select(
New(
TypeTree(
appliedType(weakTypeOf[V].typeConstructor, weakTypeOf[T] :: weakTypeOf[U] :: Nil)
)
),
termNames.CONSTRUCTOR
),
List(expression.tree, Literal(Constant(expression.tree.toString)))
)
)
}
}

这有效。但是,它会导致类型推断出现问题。

例如,如果我尝试调用一个名为“map”的方法,该方法采用 TransparentFunction1[Int, Int] 类型的参数,如下所示:

map(_ + 2)

我收到错误“扩展函数缺少参数类型”,而如果映射的参数类型只是 Int => Int,则类型推断可以正常工作。

有没有办法修复宏以便类型推断继续工作?

最佳答案

要解决此问题,您只需 TransparentFunction1延长Function1 (无论如何,这看起来很自然,因为 TransparentFunction1 在概念上非常像 Function1 ,它只是添加了一个自定义 toString 但应该充当普通函数):

class TransparentFunction1[-T1, +R1](val func : T1 => R1, val text : String) extends (T1 => R1){
@inline
def apply(t : T1) = func(t)

override def toString = text
}

对于定义一个扩展的类似函数的类,我认为只有少数原因 Function1 。在我的脑海中,主要原因是当您的类被设计为用作隐式值(例如类型类)时,并且您不希望编译器自动使用这些隐式值作为隐式转换(它将如果它扩展 Function1 )。这里的情况似乎并非如此,因此 TransparentFunction1延长Function1似乎是正确的做法。

关于scala - Lambda 类型推断和隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31435089/

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