17
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アカウンティング・サース・ジャパンAdvent Calendar 2017

Day 8

Scalaz 名前がかっこいい

Last updated at Posted at 2017-12-07

今回初めて本格的に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)はどう見ても串にさしたおでんのはんぺんに見えてくるしろものだ"\&/"とかはしらたきか

/|@| <> <> ^ &&& :-> <-: >>= ||| <<< >>> |=> <=| |> ?? |+| !&& --> | ? <^> !? :?>> < :++>> <++: <===> -+- =?= ⊛&/

17
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?