标签: partialfunction

scala的案例保护声明中的变量范围

对于电梯开发,我有时需要使用match- case如下所示的语句.(为了便于理解,重写为普通scala.)给他们一个注意事项:这些实际上是不同的部分函数,​​在代码的不同部分定义,所以重要的是case语句在guard中或之前失败以使其他部分评估的函数(如果匹配失败,那就是).

// The incoming request
case class Req(path: List[String], requestType: Int)

// Does some heavy database action (not shown here)
def findInDb(req: Req):Option[Int] = 
  if(req.path.length > 3) Some(2) else None

Req("a"::"b"::Nil, 3) match {
  case r@Req(`path` :: _ :: Nil, 3) if findInDb(r).isDefined =>
    doSomethingWith(findInDb(r))
  case r@Req(`path` :: _ :: Nil, _) => doDefault
  case _ => doNothing
}
Run Code Online (Sandbox Code Playgroud)

现在,为了知道case语句成功,我必须查询数据库findInDb并检查结果是否有效.之后,我必须再次调用它来使用该值.

做点什么

case r@Req(path, 3) if {val res = findInDb(r); res.isDefined} =>
Run Code Online (Sandbox Code Playgroud)

不起作用,因为范围 …

scope scala case pattern-matching partialfunction

8
推荐指数
2
解决办法
3513
查看次数

Scala,部分功能

有没有办法PartialFunction通过case声明创建一个除外?

我很好奇,因为我想表达以下内容(scala pseudo ahead!)...

val bi = BigInt(_)
if (bi.isValidInt) bi.intValue
Run Code Online (Sandbox Code Playgroud)

......作为一个部分功能,并做

val toInt : PartialFunction[String, Int] = {
    case s if BigInt(s).isValidInt => BigInt(s).intValue
}
Run Code Online (Sandbox Code Playgroud)

因为我创造了BigInt两次似乎是多余的.

scala pattern-matching extractor partialfunction

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

Scala:选择返回Option与PartialFunction的函数

我是一个相对Scala初学者,并希望得到一些关于如何继续实现的建议,看起来可以通过返回Option或PartialFunction的函数来完成.我已经阅读了我能找到的所有相关帖子(参见问题的底部),但这些似乎涉及使用PartialFunction或将其中一个转换为另一个的技术细节; 我正在寻找类型的答案"如果情况是X,Y,Z,那么使用A其他B,但也考虑C".

我的示例用例是使用路径查找器库在位置之间进行路径搜索.假设位置是类型L,路径是类型P,所需的路径搜索结果是Iterable[P].补丁搜索结果应该通过询问所有路径查找器(像Google地图这些可能是自行车,汽车,步行,地铁等等)的路径建议来组装,这些建议可能会或可能不会针对特定的开始/定义结束位置对.

似乎有两种方法可以解决这个问题:

(a)将路径查找器定义为f: (L,L) => Option[P],然后通过类似的方式获得结果finders.map( _.apply(l1,l2) ).filter( _.isDefined ).map( _.get )

(b)将路径查找器定义为f: PartialFunction[(L,L),P] and then get the result via something likefinders.filter(_.isDefined((l1,l2))).map(_.apply((l1,l2)))`

似乎使用函数返回Option[P]将避免对结果进行双重评估,因此对于昂贵的计算,除非有人缓存结果,否则这可能是优选的.似乎使用Option一个可以有一个任意输入签名,而PartialFunction期望一个参数.但是我特别感兴趣的是听到有实际经验的人关于不那么直接,更大的"更大图片"考虑因素,例如与Scala库的交互.使用a PartialFunction会在提供可能以其他方式获得回报的集合API的某些方法方面具有显着优势吗?这样的代码通常会更简洁吗?

相关但不同的问题:

scala option partialfunction

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

在scala中扩展部分实现的部分函数

我在这里使用Akka actor库.actors库定义了一个部分函数"receive",扩展"actor"的actor必须实现处理各种消息.我正在为我的应用程序创建一个特征层次结构,其中trait"clockActor"扩展了Actor,"MasterClock"和"SubClock"扩展了"clockActor".我想在"时钟"特性的接收功能中添加时钟的通用功能,但是如何在主时钟和副时钟特性中为接收功能添加额外的功能?

简而言之,我需要一种方法来向部分函数添加额外的case语句.想法?

scala traits partialfunction actor akka

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

如何将scala Map转换为部分函数

目前我使用以下代码片段:

private val aMap = Map(
  "J" -> Journey,
  "T" -> Training
)

def partialFunction = {
  case x if aMap isDefinedAt x => aMap(x)
}
Run Code Online (Sandbox Code Playgroud)

在我看来,地图自然应该定义一个部分功能.Scala是否有任何标准/更简洁明确的方法将地图转换为部分功能?也许某种隐式转换?

scala map partialfunction

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

无法将PartialFunction放在scala类构造函数中

似乎有一个限制,你不能PartialFunction在类构造函数中使用文字:

scala> case class X(a: PartialFunction[Any, Any]) { def this() = this({case x => x}) }
<console>:7: error: Implementation restriction: <$anon: Any => Any> requires premature access to class X.
   case class X(a: PartialFunction[Any, Any]) { def this() = this({ case x => x}) }
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是为什么部分函数文字需要访问"this".我的第二个问题/观察是在Scala REPL中,再次运行相同的代码会导致REPL崩溃:

scala> case class X(a: PartialFunction[Any, Any]) { def this() = this({ case x => x}) }
java.lang.NullPointerException
    at scala.tools.nsc.Global$Run.compileLate(Global.scala:1595)
    at scala.tools.nsc.GlobalSymbolLoaders.compileLate(GlobalSymbolLoaders.scala:29)
    at scala.tools.nsc.symtab.SymbolLoaders$SourcefileLoader.doComplete(SymbolLoaders.scala:369)
    ...
Run Code Online (Sandbox Code Playgroud)

最后,这个问题有一个很好的解决方法吗?

scala partialfunction

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

Scala部分函数类型定义

val even: PartialFunction[Int, String] = PartialFunction[Int, String] {
  case i if i % 2 == 0 => i + " is even"
}

val isEven: PartialFunction[Int, String] = {
  case i if i % 2 == 0 => i + " is even"
}

val odd: PartialFunction[Int, String] = PartialFunction[Int, String] {
  case x if x % 2 == 1 => x + " is odd"
}


val isOdd: PartialFunction[Int, String] = {
  case x if x % 2 == …
Run Code Online (Sandbox Code Playgroud)

scala partialfunction

6
推荐指数
2
解决办法
270
查看次数

在函数式编程术语中,使用 orElse 或其他后备方法的东西怎么称呼?

以 scala 为参考,我们在几个地方看到了后备行为 ( orElse),例如PartialFunctionOption和 cats EitherOps

这感觉类似于单子的扁平化行为,但又不同。是否有函数式编程术语来描述表现出这种行为的事物?

编辑:到目前为止,我发现了一些很好的答案,在猫身上进行了更多挖掘

Semigroup[Option[String]].combine(None, Some("b"))
res0: Option[String] = Some(b)

Semigroup[Option[String]].combine(Some("a"), Some("b"))
res1: Option[String] = Some(ab)

SemigroupK[Option].combineK(None, Some("b"))
res2: Option[String] = Some(b)

SemigroupK[Option].combineK(Some("a"), Some("b"))
res3: Option[String] = Some(a)

SemigroupK[List].combineK(List("a"), List("b"))
res4: List[String] = List(a, b)

Alternative[List].unite(List(None, Some("a"), Some("b")))
res4: List[String] = List(a, b)
Run Code Online (Sandbox Code Playgroud)

所以我现在发现 scalazAlt和 haskellAlternative与 cats 不太一样Alternative。更有趣的是(根据 cats 文档在 scalaz 中SemigroupK调用)。 那么我们是否可以说这种行为是由一种类型表现出来的,如果没有其内部类型的半群,则无法为其定义半群(因为这样我们可能会说 scalaz和 haskell是此类的半群)?Plus
AltAlternative

functional-programming scala partialfunction scala-cats

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

PartialFunction orElse在其类型边界上是否比它应该更宽松?

让我们定义一个PartialFunction[String, String]和一个PartialFunction[Any, String]

现在,给定定义 orElse

def orElse[A1 <: A, B1 >: B](that: PartialFunction[A1, B1]): PartialFunction[A1, B1] 
Run Code Online (Sandbox Code Playgroud)

我希望不能把这两者组合起来,因为

A→交通String
A1→交通Any

因此,约束A1 <: A(即Any <: String)不成立.

出乎意料的是,我可以编写它们并获得PartialFunction[String, String]整个String域的定义.这是一个例子:

val a: PartialFunction[String, String] = { case "someString" => "some other string" }
// a: PartialFunction[String,String] = <function1>

val b: PartialFunction[Any, String] = { case _ => "default" }
// b: PartialFunction[Any,String] = <function1>

val c = a orElse …
Run Code Online (Sandbox Code Playgroud)

types scala partialfunction

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

Scala:是否可以从左折叠获得部分应用的函数?

我目前正在学习 Scala,我只是想知道左折叠。由于左折叠是柯里化的,因此您应该能够获得带有第一个参数的部分应用函数(PAF),如下所示。

(0 /: List(1, 2, 3)) _
Run Code Online (Sandbox Code Playgroud)

但实际上,我有一个错误。

<console>:8: error: missing arguments for method /: in trait TraversableOnce;
follow this method with `_' if you want to treat it as a partially applied function
Run Code Online (Sandbox Code Playgroud)

然后我通过向右折叠尝试了同样的事情,如下所示

(List(1, 2, 3) :\ 0) _
Run Code Online (Sandbox Code Playgroud)

这样,它就正确了,我可以得到一个PAF,例如((Int, Int) => Int) => Int

我知道我可以通过使用foldLeft方法获得PAF,但我想知道是否可以用“/:”来表达它。

scala partialfunction foldleft

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