CLOVER🍀

That was when it all began.

Scalaz BooleanW

今月頭の更新で、Scalazをはじめましたと書きましたが、早々に仕事に忙殺されていたので、あんまり触れてませんでした。今後も忙しいので、それで終了!となるのもなんだかなぁという感じですので、合間に少しずつ遊んでいくことにします。

よって、本当に更新は遅いかもですけどね。

前回、暗黙の型変換でScalaの基本的なクラスに便利なメソッドを提供しているらしい、と書きました。これ自体はScalazの提供機能の一部ですが、まずはここからやっていこうと思います。全部の型・メソッドの組み合わせをやるつもりはなくて、Boolean、Int、List、Option、Stringあたりが使えればとりあえずはいいかなぁと。

というわけで、まずはBoolean(BooleanW)を。

BooleanW
http://scalaz.github.com/scalaz/scalaz-2.9.1-6.0.2/doc/scalaz/BooleanW.html

Booleanを拡張ということだけあって、これは動きがそこそこ推測しやすいです。

以下、試したものを列挙。

!

trueの時だけ、引数の関数を実行するメソッド。よって、戻り値はUnit。

  true ! println("True!")
  false ! println("False!")

実行結果。

True!

falseの方は出力されません。

!?

falseの時は引数の関数の結果を返し、trueの時はZeroを返します。Zeroの意味は、型によって当然異なりますし、何が変えるかは!?メソッドの暗黙の引数でZeroを取っているので、この結果が返るんでしょうね。

  println("true !? => " + {
    true !? List(1, 2, 3)
  })
  println("false !? => " + {
    false !? List(1, 2, 3)
  })

実行結果。

true !? => List()
false !? => List(1, 2, 3)
?

Conditionalトレイトというものが返ります。Conditionalは、|メソッドのみを持ちます。つまり単体では使わず、|メソッドと組み合わせて使うことになります。

  println("true ? => " + {
    true ? "True" | "Default"
  })
  println("false ? => " + {
    false ? "False" | "Default"
  })

実行結果。

true ? => True
false ? => Default

Option#getOrElseみたいですね。

??

!?の反対。trueの時に引数に与えた関数の評価結果が、falseの時にはZeroが返ります。

  println("true ?? => " + {
    true ?? List(1, 2, 3)
  })
  println("false ?? => " + {
    false ?? List(1, 2, 3)
  })

実行結果。

true ?? => List(1, 2, 3)
false ?? => List()
either

ConditionalEitherトレイトというものが返ります。ConditionalEitherトレイトはorメソッドのみを持ち、これがEitherを返します。trueの場合はorの左がLeftとして、falseの場合はorの右がRightとして返ります。…ああ、文章が意味不明。

  println("true either => " + {
    (true either 1 or 0).left.get
  })
  println("false either => " + {
    (false either 1 or 0).right.get
  })

実行結果。

true either => 1
false either => 0

値は、Eitherを開けて取り出す必要があります。

fold

trueの時は第1引数に与えた関数の結果が、falseの時は第2引数に与えた関数の結果が返ります。

  println("true fold => " + {
    true fold ("True", "Default")
  })
  println("false fold => " + {
    false fold ("False", "Default")
  })

実行結果。

true fold => True
false fold => Default
guard

GuardPreventトレイトが返ります。GuardPreventトレイトは、applyメソッドのみを持つトレイトで、applyメソッドは暗黙の引数としてEmptyを取ります。Zeroと同じく、Emptyの結果は型次第、ということでしょう。

  println("true guard => " + {
    true.guard[Option](1)
  })
  println("false guard => " + {
    false.guard[Option](1)
  })

実行結果。

true guard => Some(1)
false guard => None
option

これは直感的ですね。trueの時は引数をSomeで包んだものが、falseの場合はNoneが返ります。

  println("true option => " + {
    true option "True"
  })
  println("false option => " + {
    false option "False"
  })

実行結果。

true option => Some(True)
false option => None
prevent

guardの反対。

  println("true prevent => " + {
    true.prevent[Option](1)
  })
  println("false prevent => " + {
    false.prevent[Option](1)
  })

実行結果。

true prevent => None
false prevent => Some(1)
unless

falseの時だけ、引数の関数を実行。Perlっぽいですね。

  true unless { println("Unless True") }
  false unless { println("Unless False") }

実行結果。

Unless False
when

unlessの反対。

  true when { println("When True") }
  false when { println("When False") }

実行結果。

When True
|Λ|

これはよくわからないです。何かに繋げて使うのかな?

  println("True |Λ| => " + {
    true |∧|
  })
  println("False |∧| => " + {
    false |∧|
  })

実行結果。

True |Λ| => true
False |∧| => false
→

true → false以外の組み合わせは、全てtrueを返します。

  println("(true → true, true → false)  => " + {
    (true → true, true → false)
  })

  println("(false → true, false → false)  => " + {
    (false → true, false → false)
  })

実行結果。

(true → true, true → false)  => (true,false)
(false → true, false → false)  => (true,true)
⇍、⇏、⇐
false ⇍ true以外は全部false
true ⇏ false以外は全部false
false ⇐ true以外は全部true

これは、APIドキュメントを見た方がいいですね…。

∧

AND

  println("(true ∧ true, true ∧ false, false ∧ true, false ∧ false) => " + {
    (true ∧ true, true ∧ false, false ∧ true, false ∧ false)
  })

実行結果。

(true ∧ true, true ∧ false, false ∧ true, false ∧ false) => (true,false,false,false)
∨

OR

  println("(true ∨ true, true ∨ false, false ∨ true, false ∨ false) => " + {
    (true ∨ true, true ∨ false, false ∨ true, false ∨ false)
  })

実行結果。

(true ∨ true, true ∨ false, false ∨ true, false ∨ false) => (true,true,true,false)

NAND

  println("(true ⊼ true, true ⊼ false, false ⊼ true, false ⊼ false) => " + {
    (true ⊼ true, true ⊼ false, false ⊼ true, false ⊼ false)
  })

実行結果。

(true ⊼ true, true ⊼ false, false ⊼ true, false ⊼ false) => (false,false,false,true)

NOR

  println("(true ⊽ true, true ⊽ false, false ⊽ true, false ⊽ false) => " + {
    (true ⊽ true, true ⊽ false, false ⊽ true, false ⊽ false)
  })

実行結果。

(true ⊽ true, true ⊽ false, false ⊽ true, false ⊽ false) => (false,true,true,true)

以上、BooleanWでしたー。