今回初めて本格的にScalaプロジェクトを引き継いだその際にScalaZというマジンガーZみたいでかっこいい名前のライブラリを使用していた。その辺のScalazについての使用方法について前任者H氏のメモを書きたいと思います。
Scalazとは
Scalaをより簡単に関数型プログラミングで記述できるライブラリで本家のScalaのサイズをしのぐライブラリ群のことです
wiki https://github.com/scalaz/scalaz/wiki
githubリポジトリ https://github.com/scalaz/scalaz
scaladoc http://scalaz.github.io/scalaz/#scaladoc
使用していたものたち
scalaz.\/ (Disjunction)
-
scala.util.Either
の代替でforの中の.rightを書かなくて済む - matchの中のRight、Leftの記号が面白いハイフン出てる方で表すんだ〜と思った
// Throwable \/ Int は中置記法で、\/[Throwable, Int] と同じ
def f: Throwable \/ Int = ???
def g: Throwable \/ Int = ???
def h: Throwable \/ Int = ???
val result = for {
a <- f
b <- g
c <- h
} yield a + b + c
result match {
case \/-(x) => println(s"処理結果: $x")
case -\/(e) => println(s"エラー: $e")
}
※JIS Macbookを使っていたので「\(バックスラッシュ)」を入力するのに一瞬困る
https://qiita.com/miyohide/items/6cb8967282d4b2db0f61
scalaz.EitherT
-
\/
とFuture
などがスタックしている場合の利便性のために使用していた -
\/
とFuture
がスタックしている型をfor式で扱おうとすると、ネストしてしまうので
EitherTを使用してネストなしで書いていた
// 戻り値の型をEitherTにする
def f: EitherT[Future, Throwable, Int] = ???
def g: EitherT[Future, Throwable, Int] = ???
def h: EitherT[Future, Throwable, Int] = ???
// for式がネストしない
val result = for {
a <- f // a にバインドされる型は、Int
b <- g
c <- h
} yield a + b + c
// 最後に run で Future[Throwable \/ Int] に変換する
val result2: Future[Throwable \/ Int] = result.run
scalaz.Validation
-
scalaz.Validation
は、複数の入力チェックメソッドを一通り動作させ、エラーが検出された場合は全てのエラーを集約した状態で返す型 -
|@|
演算子で連結すると、for式とは異なり、途中でエラーを検出しても処理を止めない
// ValidationNel[A, B] は、Validation[NonEmptyList[A], B] のエイリアス
// NonEmptyListは、要素が1以上格納されていることが保証されているリスト
def f: ValidationNel[String, Int] = ???
def g: ValidationNel[String, Int] = ???
def h: ValidationNel[String, Int] = ???
// |@| はアプリカティブファンクタの演算子
// 例えば、f が Failure だったとしても 後続の g、h を処理する
val result = (
f |@|
g |@|
h
) { (a, b, c) =>
a + b + c
}
// Validation に対するパターンマッチ
result match {
case scalaz.Success(x) => println(s"処理結果: $x") // x: Int
case scalaz.Failure(e) => println(s"エラー: $e") // e: NonEmptyList[String]
}
※どう見ても|@|は"なると"だよな〜 でもすごい便利だなぁと思った
最後に
※Scalaの記号っておでんだよね〜って引き継ぎで笑って終わったのが印象的だった
/-(x)とか-/(e)はどう見ても串にさしたおでんのはんぺんに見えてくるしろものだ"\&/"とかはしらたきか
/|@| <> <> ^ &&& :-> <-: >>= ||| <<< >>> |=> <=| |> ?? |+| !&& --> | ? <^> !? :?>> < :++>> <++: <===> -+- =?= ⊛&/