@duplode Да, хорошо. Почему я не могу сериализовать объект функции? У него есть тип, верно? Это называется Стрелка или что-то в этом роде, верно? Почему объект функции должен отличаться от любого другого объекта?
data Task = Task
{ id :: String
, description :: String
, dependsOn :: [String]
, dependentTasks :: [String]
} deriving (Eq, Show, Generic, ToJSON, FromJSON)
type Storage = Map String Task
s :: Storage
s = empty
addTask :: Task -> Storage -> Storage
addTask (Task id desc dep dept) = insert id (Task id desc dep dept)
removeTask :: String -> Storage -> Storage
removeTask tid = delete tid
changes = [addTask (Task "1" "Description" [] []), removeTask "1"]
main = putStrLn . show $ foldl (\s c -> c s) s changes
оложим, у меня есть следующий код. Я хочу хранитьchanges
список в файле JSON. Но я не знаю, как это сделать с Aeson, кроме, вероятно, написания собственного анализатора, и, очевидно, должен быть лучший способ сделать это. Как, возможно, используя расширение языка для получения(Generic, ToJSON, FromJSON)
заaddTask
а такжеremoveTask
так далее...
РЕДАКТИРОВАТЬ. Для всех людей, которые говорят: «Вы не можете сериализовать функцию».
Прочитайте комментарии к ответу на этот вопрос.
Экземпляр Показать для функции
Тем не менее, невозможно определить шоу, чтобы на самом деле дать вам больше? подробно о функции. - Луи Вассерман 12 мая '12 в 14:51
Конечно да. Это может показать тип (данный через Typeable); или он может показать некоторые из входов и выходов (как это делается в QuickCheck).
EDIT2. Хорошо, я понял, что у меня не может быть имени функции в сериализации. Но можно ли это сделать с помощью шаблона Haskell? Я вижу, что aeson поддерживает сериализацию через шаблон Haskell, но как новичок в Haskell не может понять, как это сделать.