gpt4 book ai didi

带有多个参数的Scala运算符重载

转载 作者:行者123 更新时间:2023-12-04 05:03:53 25 4
gpt4 key购买 nike

简而言之:我试着写一些类似 A <N B 的东西对于 Scala 中的 DSL,对于类型 T 的整数 N 和 A、B。这样做有很好的可能性吗?

更长:我尝试为 TGrep2 写一个 DSL在斯卡拉。我目前有兴趣写

A <N B          B is the Nth child of A (the rst child is <1).

以一种很好的方式并尽可能接近 Scala 中的原始定义。有没有办法重载 <运算符,它可以接受一个 N 和一个 B 作为参数。

我试过的:我尝试了两种不同的可能性,但这并没有让我很高兴:
scala> val N = 10
N: Int = 10

scala> case class T(n:String) {def <(i:Int,j:T) = println("huray!")}
defined class T

scala> T("foo").<(N,T("bar"))
huray!


scala> case class T(n:String) {def <(i:Int) = new {def apply(j:T) = println("huray!")}}
defined class T

scala> (T("foo")<N)(T("bar"))
warning: there were 1 feature warnings; re-run with -feature for details
huray!

最佳答案

我建议你使用类似 nth 的东西而不是 <使语义清晰的符号。 A nth N is B至少对我来说很有意义。它会转化为类似的东西

case class T (label:String){
def is(j:T) = {
label equals j.label
}
}

case class J(i:List[T]){
def nth(index:Int) :T = {
i(index)
}
}

你可以很容易地做到:
val t  = T("Mice")
val t1 = T("Rats")
val j = J(List(t1,t))

j nth 1 is t //res = true

关于带有多个参数的Scala运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15758766/

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