我是scala的新手,我无法理解以下功能
val L = List(List(1, 1), 2, List(3, List(5, 8)))
def flatten(l: List[Any]): List[Any] = l flatMap {
case ms:List[_] => flatten(ms)
case l => List(l)
}
flatten(L) // res2: List[Any] = List(1, 1, 2, 3, 5, 8)
Run Code Online (Sandbox Code Playgroud)
特别是我不理解第一种情况的组合flatMap和模式匹配以及意义ms:List[_]
有人可以解释一下,也许可以提供一个更简单的例子来澄清这个概念吗?
我们假设我们有一个选项foo1和一个选项foo2:
val foo1: Option[Foo]
val foo2: Option[Foo]
Run Code Online (Sandbox Code Playgroud)
是否有运营商/功能,让我返回的值foo2时foo1是None?
val finalFoo: Option[Foo] = foo1.getOrElseOption(foo2)
Run Code Online (Sandbox Code Playgroud)
以上getOrElseOption显然不存在.我知道我们可以这样做,但它有点冗长且难以理解:
foo1.map(Some(_)).getOrElse(foo2).
Run Code Online (Sandbox Code Playgroud) 我有一个简单的PartialFunction
type ChildMatch = PartialFunction[Option[ActorRef], Unit]
def idMatch(msg: AnyRef, fail: AnyRef)(implicit ctx: ActorContext): ChildMatch = {
case Some(ref) => ref forward msg
case _ => ctx.sender() ! fail
}
Run Code Online (Sandbox Code Playgroud)
但是当我试图使用它时 - 编译器需要这样的声明:
...
implicit val ctx: ActorContext
val id: String = msg.id
idMatch(msg, fail)(ctx)(ctx.child(id))
Run Code Online (Sandbox Code Playgroud)
你可以看到它想要ctx作为第二个参数而不是隐含的
我怎么能改变我的idMatch函数使用它像这样:
...
implicit val ctx: ActorContext
val id: String = msg.id
idMatch(msg, fail)(ctx.child(id))
Run Code Online (Sandbox Code Playgroud)
?
我定义了两个部分函数(散列),我希望它们采用可选的第二个布尔参数:
def SHA1 = hash(MessageDigest.getInstance("SHA-1"))_
def MD5 = hash(MessageDigest.getInstance("MD5"))_
private def hash(algorithm:HashAlgorithm)(s:String, urlencode:Boolean = false) = {
val form = if (urlencode) "%%%02X" else "%02X"
(algorithm.digest(s.getBytes) map(form format _)).mkString
}
Run Code Online (Sandbox Code Playgroud)
当我使用两个参数调用该函数时,它会编译,但只有一个参数时我会收到编译错误:
// First 3 tests are fine
val test1 = hash(MessageDigest.getInstance("SHA-1"))("foo", true)
val test2 = hash(MessageDigest.getInstance("SHA-1"))("foo")
val test3 = SHA1("foo", true)
// not enough arguments for method apply: (v1: String, v2: Boolean)String in trait Function2. Unspecified value parameter v2.
val test4 = SHA1("foo")
Run Code Online (Sandbox Code Playgroud)
我只是将其重构为使用部分函数,在重构之前,我可以强制哈希函数使用默认值而不会出现任何问题。
为什么部分函数实现无法允许默认参数的任何想法?我使用部分函数和柯里化一起做错了吗?