其他答案建议使用"-Xlog-implicits"选项来调试"分散隐式扩展"错误.但是,它也会在与这些错误无关的地方记录大量含义.有没有办法限制它只能解释产生编译错误的地方?
我想在Matplotlib中绘制隐式方程(形式为f(x,y)= g(x,y),例如X ^ y = y ^ x).这可能吗?
我理解Scala中的隐式参数和隐式转换,但我今天第一次看到这个:匿名函数中参数前面的隐式关键字:
Action { implicit request =>
Ok("Got request [" + request + "]")
}
Run Code Online (Sandbox Code Playgroud)
隐式关键字在这里做什么?
网络上是否有资源可以更详细地描述用例?
让我们考虑一下这个功能:
def foo(implicit a:Int, b:String) = println(a,b).
现在,让我们假设有一个隐含的String和Int(implicit val i1=1)的范围,但我们想传递一个其他的,没有隐含的Int(val i2=2明确的)来foo.
我们怎么做?可能吗?谢谢阅读.
我想要做的是创建一个函数,它将采用泛型类并在其中使用静态方法(对不起Java语言,我的意思是它的伴随对象的方法).
trait Worker {def doSth: Unit}
class Base
object Base extends Worker
// this actually wouldn't work, just to show what I'm trying to achieve
def callSthStatic[T that companion object is <: Worker](implicit m: Manifest[T]) {
// here I want to call T.doSth (on T object)
m.getMagicallyCompanionObject.doSth
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一些代码嵌套调用flatMap,如下所示:
foo.flatMap(implicit f => bar(123).flatMap(b =>
/* and so on... implicit f is still in scope here.*/
))
Run Code Online (Sandbox Code Playgroud)
通常,人们会将其写为理解,这使得代码更具可读性:
for {
f <- foo
b <- bar(123)
/* yet more method calls that need f as an implicit parameter*/
}
Run Code Online (Sandbox Code Playgroud)
但我需要f暗示,我不认为有办法用于理解.在那儿?当然我可以明确地传递f,但这意味着再见DSL.我对Scala 2.9和2.10的答案感兴趣.
为了清楚起见,我想做这样的事情,但它不会编译:
for {
implicit f <- foo
b <- bar(123) //bar takes implicit argument
/* yet more method calls that need f as an implicit parameter*/
}
Run Code Online (Sandbox Code Playgroud)
编辑:也许一个功能请求是一个好主意?
EDIT2:这应该适用于所有可以用于理解的类型,因此不仅仅是通常的集合类型,如List或Seq,还有Future …
请原谅我,如果已经在别处问过这个问题.我有一个涉及函数值和隐式参数的Scala语法问题.
我很自在地使用Scala的currying功能.例如,如果我有一个sum函数,并希望使第二个参数隐含:
scala> def sum(a: Int)(implicit b: Int) = a + b
sum: (a: Int)(implicit b: Int)Int
Run Code Online (Sandbox Code Playgroud)
有没有办法使用函数值语法执行此操作?忽略隐含片刻,我通常会写出如下的curried函数值:
scala> val sum2 = (a: Int) => (b: Int) => a + b
sum: (Int) => (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
但是,第二种方法中的函数签名是非常不同的(currying正在明确表达).只是将隐式关键字添加到b中没有多大意义,编译器也会抱怨:
scala> val sum2 = (a: Int) => (implicit b: Int) => a + b
<console>:1: error: '=>' expected but ')' found.
val sum2 = (a: Int) => (implicit b: Int) => a + b
^
Run Code Online (Sandbox Code Playgroud)
此外,从第一种获取函数值的方法中部分应用总和也会导致问题:
scala> val sumFunction = …Run Code Online (Sandbox Code Playgroud) 显然,静态类上不能有实例成员,因为该类永远不会被实例化.为什么我们需要将成员声明为静态?
我一直想知道透明 implicit转换是否真的是一个好主意,是否真的可以更好地使用implicits更多,嗯,明确.例如,假设我有一个接受a Date作为参数的方法,并且我有一个隐式转换,它将a String转换为Date:
implicit def str2date(s: String) : Date = new SimpleDateFormat("yyyyMMdd").parse(s)
private def foo(d: Date)
Run Code Online (Sandbox Code Playgroud)
那显然我可以通过透明implicit转换来调用它:
foo("20090910")
Run Code Online (Sandbox Code Playgroud)
将字符串转换为更明确的日期这一事实会更好吗?
class DateString(val s: String) {
def toDate : Date = new SimpleDateFormat("yyyyMMdd").parse(s)
}
implicit def str2datestr(s: String) : DateString = new DateString(s)
Run Code Online (Sandbox Code Playgroud)
那么用法看起来更像是:
foo("20090910".toDate)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是稍后会发生什么事情更清楚 - 我现在已经被implicit我应该知道的透明转换(Option对Iterable任何人?)已经被抓了几次,这种用法仍然允许我们利用implicit秒.
通常不需要关注Scala中的隐式参数,但有时理解编译器如何自动提供它们非常有用.不幸的是,这种理解似乎很难获得!
在给定的代码段中是否有一种通用的方法来发现如何提供隐式参数?
理想情况下,有一天IDE集成会以某种方式提供这些信息,但我现在预计我将不得不深入挖掘.有没有办法让编译器准确解释它在任何给定点选择的隐式定义?这可以从其他编译器输出间接解密吗?
举个例子,我想知道如何计算出我自己在implicit bf: CanBuildFrom[Repr, B, That]参数TraversableLike.map从何而来,不读这样的问题这样一个堆栈溢出!