Showは表示可能という性質を与えます。
インスタンスは普通にnewで作ることもできますが、Showsに定義された関数を使っていきましょう。
Shows
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)" |
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"などの文字列は返らない)。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"Scalaz".show assert_=== List('S', 'c', 'a', 'l', 'a', 'z') | |
"Scalaz".shows assert_=== "Scalaz" | |
346.shows assert_=== "346" |
println
名前通りの関数。
rpscalaで初めて気がついた。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> 1.print | |
1 | |
scala> "Scalaz".println | |
Scalaz | |
text
scala.xml.Textを返す関数・・・・・需要あるの?
scala.xml.Elemのインスタンスはデフォルトでは存在しない模様。
こっちの方が重大じゃなイカ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
implicit def ElemShow: Show[xml.Elem] = showA | |
<scala>{ "Scalaちゃん".text }</scala> assert_=== <scala>Scalaちゃん</scala> |
これらの関数と昨日紹介したassert_===など。
他にもLoggerやWriterに関係するものがあったりするけどまた今度。
0 件のコメント:
コメントを投稿