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でそれをどうやって行うのか分かりません。おそらくカスタムパーサーを書くことを除いて、明らかにそれを行うためのよりよい方法が必要です。多分、addTask
とremoveTask
など(Generic, ToJSON, FromJSON)
を得るために言語拡張を使用するのと同じように...関数型をhaskellでjsonにシリアル化するには?
EDIT。 「あなたは機能をシリアライズできません」と言うすべての人々にとって。
この質問に対する回答を読む。
言った、それは実際にあなたに 多くを与えるためにショーを定義することはできませんか?関数の詳細。 - Louis Wasserman May 12 '12 at 14:51
確かです。タイプを示すことができます(Typeableで指定します)。 QuickCheckのように入力と出力の一部が表示されることがあります。
EDIT2。さて、私はシリアル化で関数名を持つことはできません。しかしこれはテンプレートHaskellで行うことができますか?私はaesonがHaskellテンプレートを介したシリアライゼーションをサポートしていることを知っていますが、ハスケルの新人はそのやり方を理解できません。
機能を「表示」したり、シリアライズしたり、比較したり、吟味したりすることはできません。 –
@ n.mええと...私は明らかに、関数アプリケーションを直列化し、手で逆シリアル化することはできますか?なぜこれは自動的に行うことが不可能であるべきですか?これはむしろ整備士です...あなたは関数名を持っています。あなたはその型を知っています。 – user1685095
@ n.m。参照透過などのために関数を表示することはできません。私が望むものは何もする必要はありません。私は関数名と引数を見たいと思っています。それだけです。 – user1685095