haskell - 模板 Haskell on Aeson
问题描述
我有这样的数据类型:
module My.Module
data A = A { aFoo :: Integer } deriving (Generic, Show)
我有 Aeson 的通用选项
import Data.Char ( toUpper, toLower )
genericOptions :: String -> Options
genericOptions prefix = defaultOptions
{ fieldLabelModifier = dropPrefix $ length prefix
, constructorTagModifier = addPrefix prefix
, omitNothingFields = True
}
where
dropPrefix l s = let remainder = drop l s
in (toLower . head) remainder : tail remainder
addPrefix p s = p ++ toUpper (head s) : tail s
所以我可以像这样使用它
instance A.FromJSON A where
parseJSON = A.genericParseJSON $ genericOptions "A"
instance A.ToJSON A where
toJSON = A.genericToJSON $ genericOptions "A"
但我意识到我可以使用一些模板 haskell
import Data.Aeson.TH ( deriveJSON )
import Language.Haskell.TH.Syntax ( Dec, Name, Q )
genericDeriveJSON :: Name -> Q [Dec]
genericDeriveJSON name =
deriveJSON (genericOptions (show name)) name
$(genericDeriveJSON ''A)
它抛出一个错误:
Exception when trying to run
compile-time code:
Prelude.tail: empty list
Code: A.genericDeriveJSON ''A
似乎返回drop l s
了dropPrefix
一个空字符串,这意味着它的值show name
不是字符串“A”。由于我认为我无法检查价值,所以有人知道价值是什么吗?
解决方案
推荐阅读
- node.js - 续集 config.json / config.js
- graphdb - 初始化插件时出错 - GraphDB 8.7.2
- typo3 - TYPO3 9.5 需要教程
- vb.net - VB超参考
- spfx - @pnp/sp 似乎缺少 .get() 方法
- c# - 当连接状态关闭时,Ora-24309 怎么会发生?
- laravel - 优化 ApiResource
- javascript - ReactJS 操作从 SQLITE3 数据库中提取的对象数据
- jenkins - Nuget 恢复不适用于 Jenkins 上的 Xamarin 表单
- html - 在一个选择中使用 :nth-child 和 :nth-last-child