f# - Thoth.Json.Net – 解码器作为函子,有可能吗?
问题描述
我为 F# 找到了这个出色的 JSON 库,它的灵感来自 Elm 的 Json.Decode,它定义了一个Decoder
像这样的基本类型:
type Decoder<'T> = string -> obj -> Result<'T, DecoderError>
(这里)
有像Decode.map这样的函数,我希望我可以使它与 F#+ 兼容,所以我可以像这样使用它:
let customerId = Decode.string |>> CustomerId
(见|>>通用映射的中缀版本)
据我所知,要使第 3 方库使用诸如 Functors 之类的 F#+ 概念,需要使用 扩展第 3 方类型static member Map
,但这Decoder<'T>
只是一个缩写。
有什么解决办法吗?有人试过吗?
PS到目前为止,我的解决方案是自定义绑定:
let (<!>) = Decode.map
let customerId: Decoder<CustomerId> = CustomerId <!> Decode.string
let submitId: Decoder<SubmitId> = SubmitId <!> Decode.string
let currency: Decoder<Currency> = Currency <!> Decode.string
// etc…
解决方案
问题是您无法控制代码。如果您可以控制它,则解决方案是:
实现
Decoder
为具体类型,而不是类型别名。类型别名不能有额外的成员,因为它不是真正的另一种类型。库作者应该使用区分大小写的联合,因为您可以使它们成为几乎零开销的结构。添加
Map
具有所需签名的成员。
或者,如果扩展成员在未来的 F# 版本中对特征约束变得可见,您将能够仅使用 Map 函数扩展类型,可能会产生一些不希望的效果,因为它是具有 2 个参数的函数的类型别名。
所以,我认为你能做的最好的就是你已经展示的东西。
附带说明一下,您可能有兴趣查看Fleece,它也提供解码器,但它也更进一步,为您提供双向的编解码器(您可以在map
它<*>
之上)。
推荐阅读
- android - android.database.sqlite.SQLiteException:不是错误(代码 0 SQLITE_OK)
- c# - 我在 oledbdatareader 收到一个错误,说 ASP.NET 中的一个或多个必需参数没有给定值
- mongodb - MongoQuery 使用添加更新文档
- typescript - 打字稿,简化,第一个参数的值控制下一个参数的类型,同时使用字符串常量
- python - 选择一个有效的选项。该选择不是可用的选择之一 - Django
- karate - 即使传递 jar 文件,我也得到 Class not found 异常
- python - requests.exceptions.HTTPError 与 requests.HTTPError
- postgresql - 管理 Postgres 脚本部署和升级
- javascript - 如何将列表元素分别添加到 2 个列表中?
- java - 尝试更新外键时出现异常