したがって、、、Option[A]
関数、およびオプション値がの場合のA => B
デフォルトがあり、最終的には。になります。(あなたの場合、isとis )。B
None
B
A
MyClass
B
Boolean
ハスケラーである私が最初にやろうと思うのはフーグルです。Option
Haskellでは、と呼ばれていることを思い出してください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
たが、役に立ちませんでした。代わりに、maybe
Haskellで関数がどのように実装されたかを確認しましょう。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が提案したパターンマッチングに帰着することに注意してください。