我有需要用来在Haskell中创建数据类型实例的CSV数据(继承 - 这里没有选择)。解析CSV没问题 - 教程和API比比皆是。
这是我的简化修剪测试案例的'show'生成的内容:
JField {fname = "cardNo", ftype = "str"} (string representation)
我能够读取将此字符串转换为JField数据记录。我的CSV数据只是字段的值,因此上面与JField对应的CSV行是:
cardNo, str
我正在以字符串列表[“cardNo”,“str”]
的形式阅读这些内容所以 - 很容易暴力破解“字符串表示”的确切格式(但在Haskell中编写Java或python样式的字符串格式不是我的目标)。
我想做这样的事情(第一个List是静态的,第二个列表是读取文件CSV):
let stp1 = zip ["fname = ", "ftype ="] ["cardNo", "str"]
导致
[("fname = ","cardNo"),("ftype =","str")]
然后连接元组 - 要么显式地用++,要么用更聪明的方式来确定。
这是我在教程之外的第一段简单代码,所以我想知道这似乎是一种合理的Haskellian方式,或者显然有更好的方法来构建这篇文章: fname =“cardNo”,ftype =“str”
不期待解决方案(这不是家庭作业,这是一项学习练习),而是批评或指导更好的方法来做到这一点。暴力行为很容易,但会破坏我的目标,即学习
答案 0 :(得分:4)
我可能会离开,但map
不会更好吗?我想我假设您将每行读入文件为[String]
,即
field11, field12
field21, field22
等
你可以写
map (\[x,y] -> JField {fname = x, ftype = y}) data
其中data
是您的输入。我认为那样做会。
答案 1 :(得分:2)
如果您已经拥有fname字段的值(例如,在变量fn
中)和ftype字段的值(在ft
中),则只需执行JField {fname=fn, ftype=ft}
。对于非String字段,只需在适当的位置插入read
。