考虑以下:
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) 假设我有一些可能有重叠域的部分函数:
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)
这看起来不干净.有没有办法使用内置案例机制来测试定义和同时评估,可能是通过将它们与测试值或类似的东西进行对比?
我有以下代码的编译问题.
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 的新手,我正在尝试 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在不匹配第一个条件时会被调用? …
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的新手,我正在尝试对其结构进行解码,我了解了模式匹配,并且语法类似于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) 我正在尝试设计一些继承部分函数的类,但我似乎无法正确地获得语法.我的超类看起来像这样:
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)
我已经尝试了很多变种,任何人都知道正确的语法是什么?
假设我正在定义一些匹配的案例,我只关心验证一个参数:
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?
我需要一些帮助来修改(简化)我的代码.
这是一个例子:
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不会给我机会编译我的代码.谢谢!