【发布时间】:2013-11-06 18:50:08
【问题描述】:
在许多情况下,能够通过其名称作为字符串设置/获取记录字段会很有用(例如,将记录转换为/从命令行参数、HTTP 标头、SQL查询结果,或将小部件存储在 GUI 树中的易于使用的记录中等)。函数可以有类型
setField::String->Val->Record->Record
getField::String->Record->Val
getFieldNames::Record->[String]
其中 Val 可能是可以转换为其他类型的东西(字符串、glib GValue,甚至是我描述的可转换对象here)
我已经开始编写一个库来执行此操作,并计划将其贡献给社区(它需要一些 GHC 扩展,可能包括 TemplateHaskell)......
我的问题-这样的东西已经存在吗?有没有更好的方法从外部名称/值对填充记录?我找遍了,找不到。 (镜头是相关的,但不要使用字符串名称)。
我认为这会很有用,但不想重新发明轮子。
【问题讨论】:
-
您可以查看 Aeson 库如何通过与 JSON 的自动转换来解决此问题,以实现
Generic的类型。 -
这似乎是个坏主意。当密钥不存在时会发生什么?无操作?也许打字?这比
Map的包装器有什么好处?与Record和某些记录类型(例如参见 aeson)进行具体化是合理的,但记录类型本身可能是愚蠢的。 -
Jozefg- 这些是任何命令行参数/SQL 查询结果/widget 集合库都必须处理的问题,但现在这一切都必须在每次使用时手动重做(即-必须编写代码才能使 System.Console.GetOpt 正常工作,难道您不想只使用包装在单个记录周围的预先编写的函数吗)。当然,您可以提供相同功能的 Maybe 版本(例如 head 与 listToMaybe)。关键是,我宁愿让一个库来处理这些错误情况,也不愿每次都记得自己处理。
标签: haskell