我很确定我在这里遗漏了一些东西,因为我对Shapeless很新,而且我正在学习,但是Aux技术何时需要呢?我看到它用于通过将type语句提升到另一个"伴侣" type定义的签名来公开语句.
trait F[A] { type R; def value: R }
object F { type Aux[A,RR] = F[A] { type R = RR } }
Run Code Online (Sandbox Code Playgroud)
但是这不等于将R放入F的类型签名中吗?
trait F[A,R] { def value: R }
implicit def fint = new F[Int,Long] { val value = 1L }
implicit def ffloat = new F[Float,Double] { val value = 2.0D }
def f[T,R](t:T)(implicit f: F[T,R]): R = f.value
f(100) // res4: Long = 1L
f(100.0f) // res5: Double = …Run Code Online (Sandbox Code Playgroud) 在Scala中,我们可以使用无参数方法,这对于DSL目的非常有用; 它们还用于为类字段自动定义getter.
我正在开发一个Java库,我想尽可能地与Scala无缝集成.我想知道是否有办法用空参数列表注释Java方法,以便Scala将其识别为无参数.
例如
class Foo {
@ParameterLess
public String[] bar() { return someArray; }
}
Run Code Online (Sandbox Code Playgroud)
所以在Scala我能做到:
val f = new Foo
f bar (0)
Run Code Online (Sandbox Code Playgroud)
没有编译器抱怨bar()有一个空参数列表?
或者,有没有办法从Java定义Scala风格的getter和setter?
注意:当然我知道在这个特定的例子中我可以通过定义解决问题
public String bar(int i) { return someArray[i]; }
Run Code Online (Sandbox Code Playgroud) 假设这f(X)是一个可以被asserted和retracted编辑的动态事实,并且假设它X始终是数字。现在,假设执行最多的查询是关于查找f(X)最小的查询。在SWI-Prolog中,我可以这样写:
min_f(R) :- aggregate(min(X), f(X), R).
Run Code Online (Sandbox Code Playgroud)
但是,显然,这总是使Prolog对所有事实执行线性搜索。现在,假设将有大量这样的事实(例如1,000,000)。由于我事先知道我会经常执行min_f/1:
f/1,以便引擎可以在O(1)中找到最小值吗?assert包含所有事实的最小堆,然后窥视头部;事实可以隐式存储在最小堆中吗?我对Prolog方言没有任何限制,因此任何其他Prolog实现都可以。
是否可以从隐式类定义自动生成用于互操作的配套 Java 静态方法?
例如:
class Foo()
object FooOps {
implicit class FooOps(foo: Foo) extends AnyVal {
def baz = "hello"
}
}
Run Code Online (Sandbox Code Playgroud)
可以作为new Foo().baz. 然而,这在 Java 中是相当不方便和不惯用的。是否可以为 Java 自动生成(例如通过宏)静态方法,就像 Kotlin 为扩展方法所做的那样?例如:
object FooOps {
@MagicAnnotation
implicit class FooOps(foo: Foo) extends AnyVal {
def baz(n: Int) = "hello"
}
// generated:
def baz(foo: Foo, n: Int) = foo.baz(n)
}
Run Code Online (Sandbox Code Playgroud)