2011年12月2日金曜日

Identity

一人Scalaz Advent Calendar

初日ということでIdentityから。

Identityの説明だけれど型クラスに関連するもの(===とか|+|とかほとんどの関数)やScalazのデータ構造(Validation,LazyTupleなど)に関するものは取り扱わないです。
後日EqualやSemigroup,Validationなどを説明するときに出てきます。

Identityは型パラメータAをとり、def value: Aという未定義の関数を持ちます。
パラメータAに様々な関数を提供するコンテナと考えてよいでしょう。


Identitys

IdentitysのmkIdentityによって全ての値はIdentityに暗黙の型変換することができます。
また、unMkIdentityによりIdentityをもとの値に戻すことも可能です。

val i: Identity[Int] = 1
val a: Int = i
view raw i1.scala hosted with ❤ by GitHub

unitalという謎のIdentity[Unit]が定義されているけど何に利用するかは不明。


Identity

??


簡単に言うとnullチェック。
nullだった場合は引数で与えた値が返る。

"Scalaz" ?? "Scalaちゃん" assert_=== "Scalaz"
(null: String) ?? "Scalaちゃん" assert_=== "Scalaちゃん"
view raw i2.scala hosted with ❤ by GitHub

|>

関数に呼び出し側の値を適用する関数。
ちょっと意味がわからない、コードを見ましょう。

1 |> (_ + 1) assert_=== 2
1 |> Option.apply assert_=== Some(1)
view raw i3.scala hosted with ❤ by GitHub

some, left, right, pair, squared

ある型に包む関数。
pairとsquaredは値のペアをタプルで返す。
def squared = pairみたいな定義だけどいるんですかこれ。

1.some assert_=== Some(1)
1.right[String] assert_=== Right(1)
"Scalaちゃん".left[Int] assert_=== Left("Scalaちゃん")
"ゲソ".pair.assert_===(("ゲソ", "ゲソ"))
"ゲソ".pair assert_=== "ゲソ".squared
view raw i4.scala hosted with ❤ by GitHub

doWhile, whileDo

名前通りの関数。
関数と述語を渡す。

1.whileDo(_ + 1, _ < 10) assert_=== 10
"Scala".doWhile({ s => println(s); readLine }, _ != "Scalaz") assert_=== "Scalaz"
view raw i5.scala hosted with ❤ by GitHub

Scalazの型クラス、データ構造に関するものを抜くとこれだけ。

これだけではScalazの便利さがわからないと思うので、ぜひ続きも見て下さい!

2 件のコメント:

  1. > unitalという謎のIdentity[Unit]が定義されているけど何に利用するかは不明。

    Identity[Unit] 型のオブジェクトって、1つでよくていくつも生成されても無駄だから、どうせならライブラリ側で用意してvalで束縛しておいたほうがいいんじゃなイカ ?

    っていう配慮だろうか・・・?

    返信削除
  2. なるほど、それもそうですね。

    しかし、unitalの使い道とは一体・・・・・

    返信削除