Ctrl + Q 找到隐式转换
Shift + Cmd + P 找到隐式参数实例的位置
如何找到隐含值/ def的使用位置?
考虑io包装中提供的默认编解码器。
implicitly[io.Codec].name //res0: String = UTF-8
Run Code Online (Sandbox Code Playgroud)
它是“低优先级”隐式的,因此很容易覆盖而不会产生歧义。
implicit val betterCodec: io.Codec = io.Codec("US-ASCII")
implicitly[io.Codec].name //res1: String = US-ASCII
Run Code Online (Sandbox Code Playgroud)
提高优先级也很容易。
import io.Codec.fallbackSystemCodec
implicit val betterCodec: io.Codec = io.Codec("US-ASCII")
implicitly[io.Codec].name //won't compile: ambiguous implicit values
Run Code Online (Sandbox Code Playgroud)
但是我们可以朝相反的方向前进吗?我们可以创建一个低级别的隐式来禁用(“歧义化”)默认值吗?我一直在研究优先级方程式,并使用低优先级隐式变量进行操作,但尚未创建默认值的歧义。
我正在尝试foldLeft为规则形状的树实现尾递归函数。该练习来自练习 3.3.5.3 中的“函数式编程的科学”一书。
到现在为止,我能够做功课,但我不知道我在这个功课中遗漏了什么。
规则形状的树有一个定义:
sealed trait RTree[A]
final case class Leaf[A](x: A) extends RTree[A]
final case class Branch[A](xs: RTree[(A,A)]) extends RTree[A]
Run Code Online (Sandbox Code Playgroud)
方法签名和预期结果:
@tailrec
def foldLeft[A,R](t: RTree[A])(init: R)(f: (R,A)=>R): R= ???
foldLeft(Branch(Branch(Leaf(((1,2),(3,4))))))(0)(_+_)
//10
Run Code Online (Sandbox Code Playgroud)
到目前为止最大的问题是我不知道如何匹配和访问Branch. 我只能匹配Leafand Branch(而不是叶子在分支内),因此递归没有结束。
我们知道,我们可以添加(减去/乘/等)两个不同Numeric类型的数字,结果将是两种类型中较宽的一种,无论它们的顺序如何.
33F + 9L // Float + Long == Float
33L + 9F // Long + Float == Float
Run Code Online (Sandbox Code Playgroud)
这是因为各7 Numeric类(Byte,Short,Char,Int,Long,Float,Double)具有7种不同的+()方法(以及-(),*()等),一个用于每个Numeric可接收为传递的参数的类型.[有一个额外的+()方法来处理String参数,但这里不需要关注我们.]
现在考虑以下内容:
implicit class PlusOrMinus[T: Numeric](a: T) {
import Numeric.Implicits._
def +-(b: T) = if (util.Random.nextBoolean) a+b else a-b
}
Run Code Online (Sandbox Code Playgroud)
如果两个操作数是相同类型,则它可以工作,但如果第一个操作数的类型比第二个操作数的类型宽,它也可以工作.
11F +- 2L // result: Float = 9.0 or 13.0 …Run Code Online (Sandbox Code Playgroud) 通常,我们可以采用任何数字类型的任何值,然后将其除以任何数字类型的任何非零值,然后得出合理的结果。
212.7 / 6 // Double = 35.449999999999996
77L / 2.1F // Float = 36.666668
Run Code Online (Sandbox Code Playgroud)
我发现的一个例外是,我们不能将a BigInt与分数类型(Float或Double)混合使用。
但是,在泛型领域中,Integral和Fractional类型之间存在这种有趣的区别。
// can do this
def divideI[I](a: I, b: I)(implicit ev: Integral[I]) = ev.quot(a,b)
// or this
def divideF[F](a: F, b: F)(implicit ev: Fractional[F]) = ev.div(a,b)
// but not this
def divideN[N](a: N, b: N)(implicit ev: Numeric[N]) = ev.???(a,b)
Run Code Online (Sandbox Code Playgroud)
尽管我对这是为什么感到好奇,但真正的问题是:是否有某种解决方法可避免此限制?
我使用的是apache-archiva-2.2.0版本.我丢失了管理员密码,所以我想重置管理员用户的密码.
我试图通过删除下面提到的文件来重置密码.
./apache-archiva-2.2.0/data/databases/users/dbex.lck
./apache-archiva-2.2.0/data/databases/users/db.lck
但仍然要求密码重新启动服务.
数据库细节 -
<New id="users" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/users</Arg>
<Arg>
<New class="org.apache.tomcat.jdbc.pool.DataSource">
<Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set>
<Set name="url">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users;create=true</Set>
<Set name="username">sa</Set>
<Set name="maxActive">20</Set>
<Set name="removeAbandoned">true</Set>
<Set name="logAbandoned">true</Set>
<Set name="initialSize">5</Set>
<Set name="testOnBorrow">true</Set>
<Set name="validationQuery">select 1</Set>
</New>
</Arg>
</New>
Run Code Online (Sandbox Code Playgroud)
让我知道如何更改密码?
Some("abcdefg").get(3) //res0: Char = d
Run Code Online (Sandbox Code Playgroud)
的参数get()被发送到apply()的方法String,但源代码为Option(和Some)不具有get()其需要的参数,和方法String不具有get在所有的方法。
那么get()正在调用什么呢?它是爪哇岛的一颗痣吗?
我观察到,如果我想创建一个可以接受任何类型的列表并返回布尔值的泛型函数,我可以使用以下语法进行函数声明:
def someFunction[A](l:List[A]):Boolean
Run Code Online (Sandbox Code Playgroud)
但是,我也可以用这种语法实现一个等效的函数声明:
def someFunction(l:List[_]):Boolean
Run Code Online (Sandbox Code Playgroud)
后一种语法对我有意义; 下划线表示任何类型的List的通配符.然而,前者令人困惑; 两种语法之间的语义差异是什么,如果有的话呢?注意:我注意到我可以用[B]或[c]甚至[%]代替第一个语法示例中的"[A]".
我是Scala的新手,我发现这个有趣的单线程从字符串生成十六进制编码的MD5哈希.我希望有人能帮助我更好地理解这一点.
private def getMd5(inputStr: String): String = {
val md: MessageDigest = MessageDigest.getInstance("MD5")
md.digest(inputStr.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft("") {_ + _}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在 coursera 上学习 martin odersky 的 scala 函数式编程课程。
但是,我无法理解第二个作业 Funsets.scala 的解决方案。
type Set = Int => Boolean
/**
* Indicates whether a set contains a given element.
*/
def contains(s: Set, elem: Int): Boolean = s(elem)
/**
* Returns the union of the two given sets,
* the sets of all elements that are in either `s` or `t`.
*/
def union(s: Set, t: Set): Set = (e: Int) => s(e) || t(e)
Run Code Online (Sandbox Code Playgroud)
问题在上面的函数中 e 是什么?它从何而来 ?我知道 …