我从以下类型创建了一个newtype
别名:IP
Data.IP
{-# 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 成绩单中,您可以看到给定的字符串可以解释为 anIP
但不能解释为 an IPAddress
:
*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,行为都是相同的。为什么 for 的Read
实例IPAddress
与 for 的实例不同IP
?