根据类型参数生成函数

2023-12-30

我想为接受 1 个类型参数的类生成函数,该参数包装按名称值。

class C[T](_t: => T) {
    def t: T = _t
}

我想要生成的函数是由可用的函数派生的T.

我真正想要的是获得所有可用的功能T,改变他们的contract and 执行以编程方式,并使它们可供C.

  • 通过更改他们的合同,我的意思是更改他们的签名,以便他们返回C[R], where R代表原函数的返回类型。

  • 通过改变它们的实现,我的意思是将结果包装在里面C在归还之前。

eg.

def +(that: Int): Int =
    this + that

将可用于C[Int] as

def +(that: Int): C[Int] =
    C(this.t + that)

这样做是为了消除必须包裹在里面的样板C计算以使其不被评估。

eg.

val c1 = new C(1)

val c2: C[Int] = C(c1.t + 1)
c2.t == 2

也可以表示为

val c2: C[Int] = c1 + 1
c2.t == 2

如何使用 Scala 2 或 dotty 宏来实现此目的?或者,可以通过其他方式实现这一点吗?


尝试根据 @KrzysztofAtłasik 在您之前的建议中添加一个隐式转换question https://stackoverflow.com/a/56915573/5249621.

implicit def conversion[T](c: C[T]): T = c.t
implicit def conversion1[T](t: => T): C[T] = new C(t)

或者使类隐式

implicit class C[T](_t: => T) {
  def t: T = _t
}

关于宏,因为您想添加需要的定义宏注释 https://docs.scala-lang.org/overviews/macros/annotations.html而不是定义宏 https://docs.scala-lang.org/overviews/macros/overview.html。 Dotty 没有宏注释,它只有内联宏 https://dotty.epfl.ch/docs/reference/metaprogramming/toc.html就像 Scala 2 def 宏一样。

宏注释也没有帮助。当你定义类时C[T]不知道是什么T是(这仅在调用站点才知道),因此不知道要添加哪些方法。

Dotty 也有隐式转换

given [T] as Conversion[T, C[T]] = new C(_)
given [T] as Conversion[C[T], T] = _.t

(目前是given,以前是implicit, then implied, then delegate,目前为 0.17given,这可以再次改变)。

它似乎Conversion[(=> T), C[T]]不允许。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据类型参数生成函数 的相关文章

随机推荐