クロージャの例を考えると、この場合、文字列内の単語数が返されます (任意の演算子が追加されています)。
val myfunc = (s: String) => Option(s).map(_.split(" ").size).filter(_ >= 2)
ボイラープレートの一部を非表示にして、次のように書く方法はありますか:
val myfunc = given[String].map(_.split(" ").size).filter(_ >= 2)
クロージャの例を考えると、この場合、文字列内の単語数が返されます (任意の演算子が追加されています)。
val myfunc = (s: String) => Option(s).map(_.split(" ").size).filter(_ >= 2)
ボイラープレートの一部を非表示にして、次のように書く方法はありますか:
val myfunc = given[String].map(_.split(" ").size).filter(_ >= 2)
2つの括弧とアンダースコアを追加して使用できる場合は、そのためのマクロは必要ありません。
class Given[A] {
def apply[B](f: Option[A] => B): A => B = (a: A) => f(Option(a))
}
def given[A] = new Given[A]
動作中:
scala> val myfunc = given[String](_.map(_.split(" ").size).filter(_ >= 2))
myfunc: String => Option[Int] = <function1>
scala> List("salmon cod herring","tuna").map(myfunc)
res4: List[Option[Int]] = List(Some(3), None)
私は疑う。マクロは、マクロが含まれている関数呼び出しを、型がチェックするものに置き換えます。それで、あなたはあなたの例で何に置き換えgiven[String]
ますか?に置き換えると(s: String) => Option(s)
、次のようになります。
((s: String) => Option(s)).map(_.split(" ").size).filter(_ >= 2)
これはあなたが望むようには機能しません。行全体を変更する必要がありますが、これは発生しません。