したがって、、、Option[A]関数、およびオプション値がの場合のA => Bデフォルトがあり、最終的には。になります。(あなたの場合、isとis )。BNoneBAMyClassBBoolean
ハスケラーである私が最初にやろうと思うのはフーグルです。OptionHaskellでは、と呼ばれていることを思い出してくださいMaybe。だから私たちはフーグルMaybe a -> (a -> b) -> b -> bし、トップヒットはmaybe :: b -> (a -> b) -> Maybe a -> b、まさに私たちが望むことをします。
data MyClass = MyClass { isOK :: Bool }
newMyClass = MyClass { isOK = true }
myVal = newMyClass
check = maybe False isOK myVal
それはよくて良いことですが、Scalaはどうですか?さて、hoogleに相当するScalaはScalexです。Scalexで検索しましOption[A] => B => (A => B) => Bたが、役に立ちませんでした。代わりに、maybeHaskellで関数がどのように実装されたかを確認しましょう。hoogleから適切なリンクをたどると、ソースを見つけることができます。
maybe :: b -> (a -> b) -> Maybe a -> b
maybe n _ Nothing = n
maybe _ f (Just x) = f x
Scalaに翻訳するのは簡単なようです
def option[A, B](opt: Option[A])(n: B)(f: A => B) = opt match {
case None => n
case Some(x) => f(x)
}
これは、次のように使用できます。
val check = option(myVal)(false)(_.isOK)
カリー化を減らしたり、Optionクラスをポン引きしたりする場合は、私よりもScalaの専門家に尋ねる必要がありますが、これは基本的にJhonnyEversonが提案したパターンマッチングに帰着することに注意してください。