【发布时间】:2015-11-21 16:19:11
【问题描述】:
我想对一个函数进行模式匹配,问题是类型擦除。请注意在下面的 sn-p 中,尽管发出了 警告,但仍会发生匹配并且出现“错误”匹配。
scala> def f1 = ()=>true
f1: () => Boolean
scala> val fl = f1
fl: () => Boolean = <function0>
scala>
scala> fl match {
| case fp :Function0[Boolean] => 1
| case _ => 2
| }
res8: Int = 1
scala>
scala> fl match {
| case fp :Function0[String] => 1
| case _ => 2
| }
<console>:11: warning: fruitless type test: a value of type () => Boolean cannot also be a () => String (but still might match its erasure)
case fp :Function0[String] => 1
^
res9: Int = 1
scala>
我能想出的是一个封装函数的案例类。我得到类型安全,请注意下面的错误。 但是,首先,这是不优雅的,其次,我不明白 case 类如何强制类型,而模式匹配却不能。我唯一的猜测是案例类受编译器保护,并且匹配仅在运行时解决
scala> case class FunctionWrapper(fn: ()=>Boolean)
defined class FunctionWrapper
scala> val fw = FunctionWrapper(fl)
fw: FunctionWrapper = FunctionWrapper(<function0>)
scala> def fs = ()=>"whatever"
fs: () => String
scala> val fws = FunctionWrapper(fs)
<console>:10: error: type mismatch;
found : () => String
required: () => Boolean
val fws = FunctionWrapper(fs)
^
scala> fw match {
| case FunctionWrapper(f) => f()
| case _ => false
| }
res10: Boolean = true
总结一下,我想知道是否有一种优雅的方式来模式匹配一个函数,也许能理解上面的例子为什么会这样
【问题讨论】:
-
无形有帮助吗? (stackoverflow.com/a/37817572/6309)
标签: function scala pattern-matching scala-2.11