#そうなんだ。ありがとうございます。>maoe
#なぜだろうaIpがIPv4だと知ってるんだからreadできてもよさげだけど。
#daimatz さんの read が no parse な問題、面白いので問題を切り出しています。とりあえず persistent や template Haskell は関係ないとおもう。
#IPv4じゃなく、newtype Foo = Foo String deriving (Show, Read, Eq, Ord)にしておいてやる分にはちゃんとread/showできるな。
#ちゃんとIPv4(newtype)のRead実装されてるっぽいけど。
#import Data.IP
data A = A IPv4
deriving (Read, Show)
foo :: IPv4
foo = read "127.0.0.1"
bar :: IP
bar = read "127.0.0.1"
baz :: A
baz = A (read "127.0.0.1")
pitfall :: A
pitfall = read (show baz) -- exception
#まだ原因は掴めていないのだけれど、中間報告でした
#ねぇ、そもそも read "127.0.0.1" :: IPv4もOKだけど"127.0.0.1"::IPv4もオッケーってなんか気になるんだけど。
#後者からするとIPv4ってTextとかStringの仲間っぽくみえるんだけど、だったらReadはread "\"127.0.0.1\""的なものにならないのか?
#read "hoge"::String -> error
#read "\"hoge\""::String -> "hoge"
#つまりShowとReadの間にはread/write invarianceが成立してなきゃならないけど実は微妙に成り立ってないとか。
#Data.IP 抜きでも read (show x) が実行時に例外を投げるようになった(作業中)
#daimatz さんの「read (show "127.0.0.1") :: A が実行時に no parse 例外を発生するのは何故?どうしたらいいの?」について、ぼくなりの理解ができました。
#ここで、 A は data A = A IPv4 です。newtype でもいいですが、ともかくですね
#みなさんありがとうございます。とりあえず persistent と TH が絡んでいるわけではなく IPv4 の定義に問題がありそうということなんですね。
#IPv4 の定義が悪いなら、僕が作者なのでいくらでも直せます。問題は、どこに原因があるのか分かってないことです。orz
#ikegami_ さん、原因を突き止められたならご教示願えますでしょうか。
#原因は instance Read IPv4 の定義にあると思いますが、外していたらすみません。
#どうしたらよいかはまだわかってないです。
#分かりました。
#A と 127.0.0.1 の間にある空白を読み飛ばすように実装されてないからですね。
#直した iproute を Hackage に上げました。テストしてみて下さい。
#すばらしい。
#yesodに対してはsmart fieldにいくらでも貢献できるという話だな。IPv4の入力しやすいUIにしてやればさらにうれしい。"."を勝手に入れてくれたりバリデートしてくれたり。
#kazu さん、試しましたが大丈夫そうです。ありがとうございます!
#直ってよかったです。:-)
#no parseっていうエラーがイマイチ
#read の代わりに reads 使えばいいときもありますが、救われないこともありました
#read は実行時に例外、reads はパーズに失敗したら [] を返します
#へー。
#でもそれで切り分けられるわけか。パースに失敗しているのかどうか。
#reads も時には実行時に例外を返します(なんでだろう…切り分けがまだできていない)
#Read クラスについてまだわからないので、どなたか文献などのポインタを教えてください: 1) deriving Read したとき readsPrec はどう定義されるのか? 2) 自分でデータ型を型クラス Read のインスタンスにするときは、どのように readsPrec を書くのか
###"The derived instance in GHC is equivalent to" の部分です。
#あっ、間違いました。 readPrec であって readsPrec じゃないですね。
#reads が実行時例外でばったりいく理由はわかりました reads = readsPrec 0 だから。read は readsPrec が空のリストを返したときに error "hogehoge no parse"してました
#Text.Read のドキュメントには readPrec だけでなく readsPrec の記述もあり、非常に参考になります。
#ところでData.Text.lines'が昔あったみたいだけど、今だとどうやるの?
#あっ、そうですね。Haskell 98 と GHC で Read クラスのインスタンスを定義するのに最低限必要なメソッドが違って、それで deriving Read したときに定義されるメソッドも違うものになってますね。
##(あとでログを読む時に分かり易いように、一応。)
#見当たりませんが、入っていたと考えられるバージョンはいくつですか? > Data.Text.lines'
#0.7.2.1以前ですよねきっと。ggったらtext-0.7.2.1が上の方に出てきて、こいつのソースを見たらlines'がコメントアウトされている。
#もしかして昔から露出されたことない?
#いや、どっちでもいいけど、どうしてるのかな\r\nでlinesしてほしい場合。
##s/Text 文字列/Text/
#ダメではないのですが、みんなどうしてるのかと。
#最終的にはRWHみたくparsec使えばいいわけですが、そしたらlines使えねーってだけになりそうなので。
#なんのために存在しているのだと。