我不想在問這個問題時無禮;但是,我最近一直在嘗試學習 Haskell,并希望了解該語言的最佳實踐。我目前正在閱讀一個決議 Haskell 檔案并將決議樹作為 json 檔案發出的庫。Main.hs的內容似乎是重復的,并試圖為決議樹的每個元素派生一個 json 生成器。人們在撰寫 Haskell 程式時通常使用代碼生成器嗎?我會假設計算機創建的代碼會破壞函式式編程的優雅,還是我錯了?是否有任何簡化以下代碼的慣用方法?
// ~80 lines of the same statements have been elided
instance ToJSON l => ToJSON (FunDep l) where
toJSON (FunDep l n1 n2)
= object [pack "FunDep" .= [toJSON l, toJSON n1, toJSON n2]]
instance ToJSON l => ToJSON (GadtDecl l) where
toJSON (GadtDecl l n1 t2)
= object [pack "GadtDecl" .= [toJSON l, toJSON n1, toJSON t2]]
instance ToJSON l => ToJSON (FieldDecl l) where
toJSON (FieldDecl l n1 b2)
= object [pack "FieldDecl" .= [toJSON l, toJSON n1, toJSON b2]]
鑒于所有函式都具有相似的簽名,是否不可能創建一個函式構建器來為決議樹的每個元素回傳必要的引數?或者,是否可以至少將必要的資訊存盤在 csv 檔案中并在運行時檢索它?
我非常熱衷于繼續我的 Haskell 研究,并且不想挑出任何特定的存盤庫。
uj5u.com熱心網友回復:
生成代碼是正常的、慣用的,并且完全用于您指向的檔案中。如果你向上滾動幾行,你會看到:
-- FIXME: Waiting for https://github.com/bos/aeson/issues/206.
{-
-- ~15 lines of the same statements have been elided
$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''FunDep)
$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''GadtDecl)
$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''FieldDecl)
-}
這些線旨在在未來的某個時候擴展到您展示的那些;請參閱鏈接問題以了解更多關于他們目前不這樣做的原因。
(除此之外:沒有什么可以阻止某人創建一個deriveToJSONs或某物,它采用型別名稱的集合而不是單個型別名稱。他們可能應該這樣做,以便他們可以撰寫
deriveToJSONs defaultOptions { sumEncoding = ObjectWithSingleField }
[''FunDep, ''GadtDecl, ''FieldDecl]
并且只有一個包含約 50 個元素的串列,而不是 50 行派生呼叫。可能他們只是沒有想到。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/498428.html
標籤:哈斯克尔
