Я хотел бы, чтобы шаблон соответствовал функции, проблема заключается в стирании типа. Обратите внимание, что в приведенном ниже фрагменте, несмотря на предупреждение , выдается совпадение и «неправильный».scala pattern соответствует функции - как обойти стирание типа
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, который завершает функцию. Я получаю тип безопасности, обратите внимание на ошибку ниже. Но, это, во-первых, inelegant и во-вторых, я не понимаю, как класс 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
Подводя итог, я хотел бы знать, если есть элегантный способ шаблона соответствовать функции, и, возможно, понять, почему приведенные выше примеры действовавшие, как они делали
Может ли бесформенная помощь? (http://stackoverflow.com/a/37817572/6309) – VonC