2011年12月3日土曜日

Show

今日はShowについて。

Showは表示可能という性質を与えます。

インスタンスは普通にnewで作ることもできますが、Showsに定義された関数を使っていきましょう。

Shows

case class ScalaChan(name: String = "Scalaちゃん")
implicit def ScalaChanShow: Show[ScalaChan] = show(_.name.toList)
implicit def ScalaChanShow: Show[ScalaChan] = shows(_.name)
ScalaChan().shows assert_=== "Scalaちゃん"
case class Ikamusume() { override def toString = "イカちゃん" }
implicit def IkamusumeShow: Show[Ikamusume] = showA
Ikamusume().shows assert_=== "イカちゃん"
implicit def SomeShow[A: Show]: Show[Some[A]] = showBy(s => (s: Option[A]))
Some(1).shows assert_=== "Some(1)"
view raw show1.scala hosted with ❤ by GitHub

showは値を受け取り、List[Char]を返す関数を渡します。
文字列ではなく、List[Char]なのはHaskellをリスペクトしてるからでしょうか?
文字列に対してはtoListなどを呼ばないといけません。

それに対してshowsはStringを返す関数を渡せばいいので、こちらを使うことが多いと思います。

showAはShowをtoStringにより実装します。
case classなどはこれでいいかもしれません。

showByは値を取り、Showのインスタンスを持つ型を返す関数を渡します。

基本的にはshowAとshowsを使っていきましょう。

Showを使う関数

show
shows

Showで定義した文字列を取得する関数。
toStringとは違い、表示できることが保証されています(大抵の場合、"A@17d577c"などの文字列は返らない)。

"Scalaz".show assert_=== List('S', 'c', 'a', 'l', 'a', 'z')
"Scalaz".shows assert_=== "Scalaz"
346.shows assert_=== "346"
view raw show2.scala hosted with ❤ by GitHub

print
println

名前通りの関数。
rpscalaで初めて気がついた。

scala> 1.print
1
scala> "Scalaz".println
Scalaz
view raw show3.scala hosted with ❤ by GitHub

text

scala.xml.Textを返す関数・・・・・需要あるの?
scala.xml.Elemのインスタンスはデフォルトでは存在しない模様。
こっちの方が重大じゃなイカ。

implicit def ElemShow: Show[xml.Elem] = showA
<scala>{ "Scalaちゃん".text }</scala> assert_=== <scala>Scalaちゃん</scala>
view raw show4.scala hosted with ❤ by GitHub

これらの関数と昨日紹介したassert_===など。
他にもLoggerやWriterに関係するものがあったりするけどまた今度。

0 件のコメント:

コメントを投稿