나는 Data.IP
에서 IP
유형의 newtype
별칭을 만들어 :이 newtype에 적합한 인스턴스가 주어지지 않는 이유는 무엇입니까?
{-# 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
(I 고아 인스턴스를 생성하지 않고 그것을 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로 값을 prepend해야하는지에 대한 설명을 좋아한다. – bdesham