如何根据输入动态创建数据类型

时间:2018-11-19 14:53:27

标签: haskell dynamic custom-data-type


针对我的原始问题进行更新

嗯,也许我之前没有完全描述我的问题。对不起大家!以下是真正的问题:

我有一个包含专利数据的txt文件,例如:

  

1/1523 DWPI

     

AP-JP29446999A 19991015

     

PN-JP2000188399 A 20000704 DW200044             JP4568930B2 B2 20101027 DW201071

     

AN-2000495116

     

PA-(NPDE)DENSO CORP

     

PR-JP1998000295406 19981016

     

MC-U11-C18A3,U12-D02A

     

OPD-1998.10.16

     

ICAI-H01L29 / 12,H01L29 / 78,H01L21 / 265,H01L21 / 336

     

TI-平面型金属氧化物半导体场效应晶体管

     

AB-<-为了简单起见,取消了内容->

     

CPY-NPDE

     

FN-JP2000188399

有1523个格式相似的项目。我想分析专利数据,因此我必须解析数据。我已经为每个字段定义了数据类型,例如:

数据AP = AP字符串日期字符串

data PN = PN String Day String

data AN = AN String

data PD = PD day

....  -- many other data types are not shown just for simplicity.

现在我已经用megaparsec为每个字段编写了解析器,例如apFieldpnFieldanField等。

但是,并非每个记录都有相同的字段,例如,第二项可能仅包含AP,PN,PA,PR,OPD,TI,AB,CPY和FN的字段,而缺少AN,MC和ICAI 。此外,某人可能对不同领域感兴趣,并且 他只导出仅包含带有AP,PN,PA,OPD和CPY字段的记录的txt文件。

现在,我想编写一个通用代码,该代码可以使用人们感兴趣的字段来解析记录,并将解析结果写入SQLite数据库中。

例如,如果要解析具有AP,PN,PA,OPD和CPY字段的记录,则可以根据输入构建记录解析器,例如toParser "ap,pn,pa,opd,cpy"toParser "ap,pa,cpy" ,我已经知道了。解析结果应分别为Record AP PN PA OPD CPYRecord AP PA CPY。然后,我想将解析结果写入数据库。由于数据中的每个记录都对应于Record数据类型,并且要解析的记录可能不同,因此我必须根据用户的输入构造具有不同字段的Record数据类型。这是我遇到的问题。

我可以通过将所有字段数据类型定义为data Field = Field [String]并将记录定义为data Record = Record [Field]来解决此问题。但是,我希望对数据类型进行更多控制,例如将日期设置为Day,将ID号设置为Int类型。

如果根据输入来构造具有不同字段的Record数据类型是不可能的,那么也许有其他方法可以解决我的问题。我感谢任何建议!很抱歉,我对问题的描述太长,以前对我的问题的描述也模棱两可!

1 个答案:

答案 0 :(得分:1)

好吧,如果我的问题正确,不,您不能编写一个函数,该函数根据输入返回不同的数据类型。但是, 可以做的是编写一个函数,该函数返回一个数据类型,该数据类型可以根据输入以不同的方式构造。例如:

data PatentRecord = PN String Day String
                  | AN String
                  | PD day

因此,现在您可以编写一个函数parseRecord :: String -> Maybe PatentRecord,例如,该函数解析您的输入,并根据匹配的内容返回使用PatentRecord构造函数或{{1}构建的PN }构造函数等

PS:实施提示:在解析错误时,请使用AN而不是Either SomeErrorType来提供更丰富的信息;-)