, 짧은에서
type ShowS = String -> String
class Show a where
showsPrec :: Int -> a -> ShowS
show :: a -> String
showList :: [a] -> ShowS
type ReadS a = String -> [(a, String)]
class Read a where
readsPrec :: Int -> ReadS a
readList :: ReadS [a]
read :: (Read a) => String -> a
이 하스켈의 표준 "직렬화"방법이 있습니다. show :: (Show a) => a -> String
은 Show
의 인스턴스 인 모든 것을 문자열로 바꿀 수 있으며 read :: (Read a) => String -> a
은 문자열을 Read
의 인스턴스로 바꿀 수 있습니다 (또는 예외를 throw 함).
표준 라이브러리의 기본 제공 유형 및 데이터 구조는 대부분 Show
및 Read
인스턴스가 정의되어 있습니다. 그들로부터 파트를 작성하는 경우, 유형에 Show
W Read
인스턴스가 정의되어 있습니다. Table
는 데이터 형식이었다
type Table = [(String, String)]
load :: (Read a) => FilePath -> IO a
load f = do s <- readFile f
return (read s)
save :: (Show a) => a -> FilePath -> IO()
save x f = writeFile f (show x)
경우, 인스턴스를 요청해야하지만, 당신은 컴파일러가 자동으로 당신을 위해 그 (것)들을 도출하도록 요청할 수 있습니다.
data Table = Table [(String, String)]
deriving (Read, Show)
경우에 따라서는 불가능하며 직접 인스턴스를 정의해야합니다.
instance Show Table where
showsPrec p x = ...
instance Read Table where
readsPrec p x = ...
하지만 공통적이어서는 안됩니다.
바이너리를 유도하기 위해 http://repetae.net/computer/haskell/DrIFT/이 마음에 듭니다. 즉,이 간단한 경우 RevList에 대한 인스턴스 읽기 및보기를 더 똑똑하게 작성할 수 있으며, 확장 성이 문제가 될 때까지 OP가 단순해야한다고 동의합니다. – ephemient