标签: partialfunction

如何使用PartialFunctions来组成我的匹配语句?

考虑以下:

scala> object Currency extends Enumeration {
     |   type Currency = Value
     |   val USD = Value
     |   val GBP = Value
     |   val EUR = Value
     |   val TRY = Value // Turkish lira
     |   val NGN = Value // Nigerian naira
     | }
defined module Currency

scala> import Currency._
import Currency._

scala> val pf: (String) => Option[Currency] = {
     |     case "$" => Some(USD)
     |     case "€" => Some(EUR)
     |     case "£" => Some(GBP)
     |     case "?" => …
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching partialfunction

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

收集单个值的多个部分函数的结果?

假设我有一些可能有重叠域的部分函数:

val funcs: Seq[PartialFunction[Any, Int]] = Vector(
{ case i: Int if i % 2 == 0 => i*2 }
,
{ case i: Int if i % 2 == 1 => i*3 }
,
{ case i: Int if i % 6 == 0 => i*5 }
)
Run Code Online (Sandbox Code Playgroud)

我想将它们应用于一个值,并收集该val定义的任何结果.我认为有一种优雅的方式可以collect用于此,但我能做的最好的方法是

val num = 66
funcs.collect { case func if func.isDefinedAt(num) => func(num) }
// or 
funcs.filter(_.isDefinedAt(num)).map(_(num))
Run Code Online (Sandbox Code Playgroud)

这看起来不干净.有没有办法使用内置案例机制来测试定义和同时评估,可能是通过将它们与测试值或类似的东西进行对比?

scala pattern-matching partialfunction

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

具有部分应用函数的变量参数

我有以下代码的编译问题.

object Main {
    def main(args:Array[String]) = {
      def collectBigger(median:Int)(values:Int*) = values.filter { _ > median }
      val passedRanks = collectBigger(5)_
      //this compiles
      println(passedRanks(Seq(5,9,5,2,1,3)))
      //this doesn't
      println(passedRanks(5,9,5,2,1,3))
    }
}
Run Code Online (Sandbox Code Playgroud)

该示例的灵感来自com.agical.gsl,这是一个swala的scala适配器.我假设它在scala 2.8之前使用了scala功能.

错误是too many arguments for method apply: (v1: Seq[Int])Seq[Int] in trait Function1和变量参数如何传递给部分应用函数有关.

感谢您提供的任何提示.

scala variadic-functions partialfunction

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

带有 isDefinedA 的 Scala PartialFunction 并应用不起作用

我是 Scala 的新手,我正在尝试 PartialFunctions,这是测试功能的正确方法吗,因为一些教程遵循此方法工作,但对我不起作用?

代码:

object MyScalaApp extends App {
def try29{
    val r = new PartialFunction[Int, Int]  
    { 
        def isDefinedAt(q: Int) = q < 0 // Applying isDefinedAt method  
        def apply(q: Int) = 12 * q // Applying apply method 
    }        
    val rr = new PartialFunction[Double, Double]  
    { 
        def isDefinedAt(q: Double) = {q < 0}
        def apply(q: Double) = 12 * q 
    }

    println(r(1))
    println(r(2))        
    println(rr(-1))
    println(rr(-2))
  }
  }
  try29
}
Run Code Online (Sandbox Code Playgroud)

输出:

12
24
-12.0
-24.0
Run Code Online (Sandbox Code Playgroud)

为什么apply在不匹配第一个条件时会被调用? …

scala partialfunction

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

部分函数模式匹配分为类和特征

Lift在Comet Actors的实现上使用了PartialFunction,你通常会在你的类上得到它:

override def lowPriority: PartialFunction[Any,Unit] = {
  case MyCaseClass1(a)        => do something here
  case MyCaseClass2(a)        => do something here
  case AlwaysPresentCaseClass => default action
}
Run Code Online (Sandbox Code Playgroud)

我想做什么,我不确定是否可能分割该部分功能,以便最后一个案例可以移动到特征中.

所以,当我有一个新的彗星演员时,我只是这样做:

class MyNewComet extends MyActorTrait {
  override def lowPriority: PartialFunction[Any,Unit] = {
    case MyCaseClass1(a)        => do something here
    case MyCaseClass2(a)        => do something here
  }
}
Run Code Online (Sandbox Code Playgroud)

不知何故,特质MyActorTrait将失踪

case AlwaysPresentCaseClass => default action
Run Code Online (Sandbox Code Playgroud)

scala partialfunction

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

了解部分功能中的“ case”关键字

我是Scala的新手,我正在尝试对其结构进行解码,我了解了模式匹配,并且语法类似于Java switch语句

val x: Int = Random.nextInt(10)

x match {
  case 0 => "zero"
  case 1 => "one"
  case 2 => "two"
  case _ => "other"
}
Run Code Online (Sandbox Code Playgroud)

这段代码非常明显并且可读。我遇到了很明显的部分函数,清楚了它们是什么

偏函数是一种不能为每个可能的输入值都提供答案的函数。

我感到困惑的是case在这样的部分函数的主体中使用:

val divide2: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 42 / d // WHAT IS THIS ?! 
}
Run Code Online (Sandbox Code Playgroud)

我不明白怎么case没有用match的语句,请问这是由Scala中,它是如何读取解释,它是一个方法,一个类或其他结构?我可以用什么其他的方法case,而不match声明

编辑:

我尝试过这种情况,但还是不明白。例如

val SomeFun: PartialFunction[Int, Int] = {
    case d: Int if …
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching partialfunction

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

如何在子类中实现部分函数

我正在尝试设计一些继承部分函数的类,但我似乎无法正确地获得语法.我的超类看起来像这样:

abstract class Controller {

    val react:PartialFunction[Event,Unit]

}
Run Code Online (Sandbox Code Playgroud)

子类看起来像:

class BoardRendererController(val renderer:BoardRenderer, val board:Board) extends Controller {

    override val react {
        case PieceMovedEvent(piece, origin, destination) => println("Moving now")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这个错误无法编译

[ERROR] /workspace/pacman/src/main/scala/net/ceilingfish/pacman/BoardRendererController.scala:14: error: '=' expected but '{' found.
[INFO]  override val react {
[INFO]                            ^
[ERROR] /workspace/pacman/src/main/scala/net/ceilingfish/pacman/BoardRendererController.scala:17: error: illegal start of simple expression
[INFO] }
[INFO] ^
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多变种,任何人都知道正确的语法是什么?

scala partialfunction

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

从部分案例中提取主要值

假设我正在定义一些匹配的案例,我只关心验证一个参数:

BytecodeChains.partial {
    case CallProperty(name, args) if name == someConstant => xxx
} ....
Run Code Online (Sandbox Code Playgroud)

功能签名是:

BytecodeChains.partial[A] (f: PartialFunction[AbstractOp, A]): ...
Run Code Online (Sandbox Code Playgroud)

如何返回整个匹配的CallProperty对象?我可以创建一个新的,但这有点难看.有没有办法引用原文代替xxx

scala partialfunction

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

如何使用Option或PartialFunction简化方法

我需要一些帮助来修改(简化)我的代码.
这是一个例子:

def getBids(rawBids: RDD[List[String]], exchangeRates: Map[String, Double]): RDD[BidItem] = {
    rawBids.filter(bidList => !bidList(2).matches(ERROR_REGEXP))
      .flatMap(bidList => {
        Constants.TARGET_LOSAS.map { losa =>
          val indexOfLosa = Constants.BIDS_HEADER.indexOf(losa)
          if (bidList(indexOfLosa) != null && !bidList(indexOfLosa).equals("") && isDoubleNumber(bidList(indexOfLosa))) {
            BidItem(bidList.head, bidList(1), losa, bidList(indexOfLosa).toDouble)
          } else {
            BidItem(bidList.head, bidList(1), losa, 0)
          }
        }
      })
      .filter(unit => unit.price != 0)
      .map(unit => {
        val convertedPrice = usdToEur(unit.price, unit.bidDate, exchangeRates)
        val convertedDate = changeDateFormat(unit.bidDate)
        BidItem(unit.motelId, convertedDate, unit.loSa, convertedPrice)
      })
  }
Run Code Online (Sandbox Code Playgroud)

我需要更改flatMap方法并避免使用"ELSE"部分代码的情况
据我所知,我们可以使用部分函数或[Option].如果我们的"if"语句为FALSE,它可以帮助我们避免情况.如果我从代码中删除ELSE部分,scala不会给我机会编译我的代码.谢谢!

scala partialfunction flatmap

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