今月頭の更新で、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でしたー。