标签: partial-functions

在展平函数中使用的模式匹配中的列表[_]的说明

我是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[_]

有人可以解释一下,也许可以提供一个更简单的例子来澄清这个概念吗?

scala pattern-matching partial-functions flatmap

2
推荐指数
1
解决办法
1797
查看次数

如何使用Scala中的另一个选项获取ORErEse

我们假设我们有一个选项foo1和一个选项foo2:

val foo1: Option[Foo]
val foo2: Option[Foo]
Run Code Online (Sandbox Code Playgroud)

是否有运营商/功能,让我返回的值foo2foo1None

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)

scala option partial-functions

1
推荐指数
1
解决办法
161
查看次数

PartialFunction隐式参数

我有一个简单的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)

scala implicit akka partial-functions

1
推荐指数
1
解决办法
94
查看次数

在 Scala 中使用部分函数时,我可以应用参数默认值吗

我定义了两个部分函数(散列),我希望它们采用可选的第二个布尔参数:

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)

我只是将其重构为使用部分函数,​​在重构之前,我可以强制哈希函数使用默认值而不会出现任何问题。

为什么部分函数实现无法允许默认参数的任何想法?我使用部分函数和柯里化一起做错了吗?

scala currying partial-functions

0
推荐指数
1
解决办法
562
查看次数