Подход show
/ read
будет работать нормально, я тоже его использую, но только для небольших значений. При больших и более сложных значениях read
будет очень медленным.
Этот надуманный пример демонстрирует плохую производительность read
:
data RevList a = (RevList a) :< a | Nil
deriving (Show, Read)
ghci> read "(((((((((((((((Nil)))))))))))))))" :: RevList Int
Кроме того, read
не сможет прочитать некоторые допустимые выражения Haskell, особенно те, которые используют конструкторы инфиксов (например, :<
в моем примере). Причина этого в том, что read
не знает о фиксированности операторов. Именно поэтому show $ Nil :< 1 :< 2 :< 3
будет генерировать много, казалось бы, лишних скобок.
Если вы хотите использовать сериализацию для больших значений, я бы предложил использовать другую библиотеку, например Data.Binary . Это будет несколько сложнее, чем простой show
, в основном из-за отсутствия deriving Binary
. Однако существуют различные универсальные программные решения, которые дают вам deriving
-подобные суррогаты.
Заключение: Я бы сказал, используйте решение show
/ read
, пока не достигнете его пределов (возможно, как только вы начнете создавать реальные приложения), затем начните смотреть на что-то более масштабируемое (но также более сложный) как Data.Binary.
Примечание: для тех, кто интересуется парсерами и более продвинутыми вещами на Haskell Примеры, которые я привел, взяты из статьи: Хаскель Ты меня читаешь? , в качестве альтернативы быстрая read
-подобная функция.