@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 не может понять, как это сделать.

Ответы на вопрос(2)

Ваш ответ на вопрос