Haskell преобразование между типами - PullRequest
0 голосов
/ 29 ноября 2018

Снова застрял на чем-то, вероятно, теоретическом.В Haskell есть много библиотек, я бы хотел использовать как можно меньше.Если у меня есть такой тип:

data Note = Note { _noteID :: Int
                 , _noteTitle :: String
                 , _noteBody :: String
                 , _noteSubmit :: String
                 } deriving Show

И используйте это для создания списка [Note {noteID=1...}, Note {noteID=2...}, ] и так далее.Теперь у меня есть список типа Note.Теперь я хочу записать его в файл, используя writeFile.Вероятно, это не позволит GHC, учитывая, что writeFile имеет тип FilePath -> String -> IO ().Но я также хочу избегать деконструкции (writeFile) и конструирования (readFile) типов все время, предполагая, что я не покину 'царство' Haskell.Есть ли способ сделать это, не используя специальные библиотеки?Еще раз: большое спасибо.Книги по Haskell хороши, но StackOverflow - это клей между книгами и реальным миром.

1 Ответ

0 голосов
/ 29 ноября 2018

Если вы ищете «быстрое исправление», для одноразового скрипта или чего-то подобного, вы можете получить Read в дополнение к Show, и тогда вы сможете использовать show преобразовать в String и read для обратного преобразования, например:

data D = D { x :: Int, y :: Bool }
    deriving (Show, Read)

d1 = D 42 True

s = show d1
-- s == "D {x = 42, y = True}"

d2 :: D
d2 = read s
-- d2 == d1

Однако, пожалуйста, пожалуйста не помещайте это в производственный код. Во-первых, вы неявно полагаетесь на то, как закодирована запись, и нет никаких проверок для защиты от незначительных изменений. Во-вторых, функция read имеет значение частичное - то есть произойдет сбой, если не удастся проанализировать ввод. И, наконец, если вы сохраните свои данные таким образом, вы застрянете с этим форматом записи и никогда не сможете его изменить.

Извините, решение для обеспечения качества производствано вам придется придумать явный, документированный формат сериализации.Обойти это невозможно - на любом языке.

...