如何在Purescript中构造首字母大写字段名的记录
解答
完全可以在纯PureScript环境下构造首字母大写字段名的记录,不需要引入外部JavaScript代码,有两种常用实现方案:
方案1:直接使用带引号的字段名语法
PureScript支持用双引号包裹字段名,绕过首字母大写的语法限制,可直接定义符合要求的记录类型:
- 类型声明和构造示例:
test :: Number -> { "Field1" :: String, "Field2" :: Number } test num = { "Field1": "something", "Field2": num }
- 字段访问语法:
readField1 :: { "Field1" :: String | rest } -> String readField1 record = record."Field1"
方案2:结合序列化库自动重命名字段(更适配API对接场景)
如果你的核心需求是输出符合格式的JSON,不需要在业务代码中频繁操作大写开头的字段,更推荐通过序列化规则重命名的方式实现,更符合PureScript的命名规范:
以常用的purescript-argonaut-codecs库为例,可通过泛型编解码配置自动转换字段名格式:
import Data.Argonaut.Codec (class EncodeJson, encodeJson) import Data.Argonaut.Generic (genericEncodeJson, defaultOptions) import Data.String (toCharArray, fromCharArray) import Data.Char (toUpper) -- 按PureScript规范定义小写首字母的普通类型 data ApiResponse = ApiResponse { field1 :: String , field2 :: Number } derive instance Generic ApiResponse _ -- 自定义序列化规则:将字段名首字母转为大写 apiSerializeOptions = defaultOptions { fieldLabelModifier = \fieldName -> case toCharArray fieldName of [] -> fieldName (firstChar : restChars) -> fromCharArray $ toUpper firstChar : restChars } instance EncodeJson ApiResponse where encodeJson = genericEncodeJson apiSerializeOptions
按上述配置后,你只需要正常构造ApiResponse { field1: "something", field2: 12 },序列化后会自动生成符合要求的{"Field1":"something","Field2":12}JSON结构。
内容的提问来源于stack exchange,提问作者Fabian Schneider
相关产品推荐
相关产品推荐

