Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用未应用的功能丰富PartialFunction_Scala_Pattern Matching_Implicit Conversion - Fatal编程技术网

Scala 使用未应用的功能丰富PartialFunction

Scala 使用未应用的功能丰富PartialFunction,scala,pattern-matching,implicit-conversion,Scala,Pattern Matching,Implicit Conversion,PartialFunction是一种天然的提取器,它的lift方法提供了精确的提取器功能。因此,使用部分函数作为提取器将非常方便。这将允许以比普通的orElse更复杂的方式组合模式匹配表达式,后者可用于PartialFunction 所以我试图用拉皮条的方法来管理我的图书馆,但失败了 更新如下:如@Archeg所示,还有另一种转换方法有效。所以我把它包括在提供的代码中 我也尝试过一些更复杂的解决方案,但都失败了 我收到以下错误消息: scala:16:error:value f不是case类

PartialFunction
是一种天然的提取器,它的
lift
方法提供了精确的提取器功能。因此,使用部分函数作为提取器将非常方便。这将允许以比普通的
orElse
更复杂的方式组合模式匹配表达式,后者可用于
PartialFunction

所以我试图用拉皮条的方法来管理我的图书馆,但失败了


更新如下:如@Archeg所示,还有另一种转换方法有效。所以我把它包括在提供的代码中

我也尝试过一些更复杂的解决方案,但都失败了


我收到以下错误消息:

scala:16:error:value f不是case类,也没有unapply/unplyseq成员 案例f(i)=>println(i)

未解析隐式。scala:28:错误:“=>”应为“”,但找到“(”。 案例Tounaply(f)(i)=>println(i)

使用所示的假定形式
TestI
可以避免此错误。但我很好奇是否可以避免
testInplace
错误:

scala:46:错误:简单模式的非法启动 案例{case“bingo”=>0}.u(i)=>println(i) ^

未解析隐式。scala:47:错误:'=>'应为,但找到';'。 案例=>println(“无”)

未解析隐式。scala:56:错误:“=>”应为“”,但找到“”。 案例g(“宾果”).u(i)=>println(i) ^


<>我不知道你到底想达到什么目的,但据我所知,提取器应该永远是对象,你无法用类来获得它。文件中实际上被称为“代码>提取器对象< /代码>。
class Wrapper[R, T](fun: PartialFunction[R, T]) {
  object PartialExtractor {
    def unapply(p: R): Option[T] = fun.lift(p)
  }
}

implicit def toWrapper[R,T](fun : PartialFunction[R,T]) : Wrapper[R, T] = new Wrapper(fun)


val f : PartialFunction[String, Int] = {
  case "bingo" => 0
}

def testFF(x : String) : Unit = x match {
  case f.PartialExtractor(i) => println(i)
  case _ => println("nothing")
}
更新

我能想到的最好的:

def testInplace(x : String) : Unit ={
  val ff = { case "bingo" => 0 } : PartialFunction[String, Int]
  x match {
   case ff.PartialExtractor(Test(i)) => println(i)
   case "sd" => println("nothing") }
}

这真的很有效,谢谢。有可能有嵌套的大小写表达式吗?当然。这就是为什么我想你会想使用unapply的提取器,而不是使用raw
f.lift
case f.PartialExtractor(IntExtractor(I))=>…
如果你有
对象IntExtractor{def unapply(I:Int):选项[Int]=if(I==0)一些(5)否则没有}
works我很怀疑您是否可以在那里内联部分函数。大小写表达式是非常特殊的表达式,而不是scala表达式。例如,所有小写标识符都被视为变量,而所有大写标识符都被视为类型/常量。大小写
f.PartialExtractor
是特殊的,但它'仍然是一种类型-它不是表达式,因此我认为您不能将表达式放在那里。我同意您不应该这样做-它看起来很难看而且很难读取。您可以将函数放在方法体中,给它一个名称并使用它。请参阅updateI尝试,请参阅update。我已将函数g定义为String=>PartialFunction[字符串,Int],它也被拒绝了,因为我说过,case表达式是一个非常特殊的表达式,你不能把任何东西放在那里。它是由特殊的规则解析的。我相信你不能把任何方法调用放在那里,但是如果你想知道更多关于它们是如何解析的,你可能应该看看scala编译器的源代码。注意
ff.partialcut或者(..)
不是方法调用。如果在普通scala表达式中编写
ff.PartialExtractor(..)
,则调用
.apply()
。但是在case表达式中调用
。unapply()
。case表达式与普通代码非常不同
def testInplace(x : String) : Unit ={
  val ff = { case "bingo" => 0 } : PartialFunction[String, Int]
  x match {
   case ff.PartialExtractor(Test(i)) => println(i)
   case "sd" => println("nothing") }
}