私はData.IP
からIP
タイプのnewtype
エイリアスを作成しました:このnewtypeには正しいReadインスタンスが与えられていないのはなぜですか?
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module IPAddress (IPAddress) where
import Data.IP (IP)
import Database.PostgreSQL.Simple.ToField
newtype IPAddress = IPAddress IP
deriving (Read, Show)
instance ToField IPAddress where
toField ip = toField $ show ip
(私は孤児のインスタンスを作成せずにそれをToField
のインスタンスを作りたかった。)
新しいタイプには見えませんしかし、それはやり方でRead
をサポートします。このGHCiの転写産物では、与えられた文字列がIPAddress
としてIP
と解釈ではなく、できることを確認できます。
*Main IPAddress> :m + Data.IP
*Main IPAddress Data.IP> read "1.2.3.4" :: IP
1.2.3.4
*Main IPAddress Data.IP> read "1.2.3.4" :: IPAddress
IPAddress *** Exception: Prelude.read: no parse
挙動は関係なく、私が上GeneralizedNewtypeDerivingを持っているかどうか、同じです。 IPAddress
のRead
のインスタンスがIP
のインスタンスと一致しないのはなぜですか?
Showインスタンスも同様に表示し、どのようなものであるかを確認してください。それは同じように読むでしょう。 – amalloy
私が正しく理解している場合、 'deriving Read'によって生成されたインスタンスは、' IPAddress'が 'data'型の場合と全く同じように動作します – pyon
@amalloy' IsString'を派生クラスのリストに追加しました。 '' 1.2.3.4 ":: IPAddress'を介して' 'IPAddress'を作成します。この値で 'show'を呼び出すと、' 'IPAddress 1.2.3.4 ''となります。実際に '' IPAddress 1.2.3.4 :: IPAddress'を読んで、私がしたいことをします。あなたはあなたのコメントを答えにするべきだと思います!私は 'IPAddress'でなぜ値を前置かなければならないのかについての説明が大好きです。 – bdesham