Как динамически создавать типы данных в зависимости от ввода - PullRequest
0 голосов
/ 19 ноября 2018

Обновление для моих оригинальных проблем

Ну, может быть, я не описал мою проблему полностью раньше.Извините за все!Вот настоящая проблема:

У меня есть текстовый файл, содержащий данные патента, такие как:

1/1523 DWPI

AP - JP29446999A 19991015

PN - JP2000188399 A 20000704 DW200044 JP4568930B2 B2 20101027 DW201071

AN - 2000495116

PA - (NPDE) DENSO CORP

PR - JP1998000295406 19981016 * 10191020 * 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 элемента с аналогичным форматом.Я хочу проанализировать патентные данные, поэтому мне нужно проанализировать данные.Я определил тип данных для каждого поля, например:

data AP = AP String Day String

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, напримеркак apField, pnField, anField и т. д.

Однако, не каждая запись имеет одинаковое поле, например, 2-й элемент может содержать только поля AP, PN, PA, PR,OPD, TI, AB, CPY и FN, при этом отсутствуют AN, MC и ICAI.Кроме того, кто-то может быть заинтересован в разных полях, и он просто экспортирует текстовый файл, содержащий записи только с полями AP, PN, PA, OPD и CPY.

Теперь я хочу написать общий код, который может анализировать записи с интересующими их полями и записывать результат анализа в базу данных SQLite.

Например, если я хочу проанализировать записи с полями AP, PN, PA, OPD и CPY, я могу создать анализатор записей в соответствии с вводом, например toParser "ap,pn,pa,opd,cpy" или toParser "ap,pa,cpy",который я понял.Анализируемый результат должен быть Record AP PN PA OPD CPY или Record AP PA CPY соответственно.Затем я хотел бы записать проанализированные результаты в базу данных.Поскольку каждая запись в данных соответствует типу данных Record, и анализируемая запись может быть разной, Мне необходимо создать тип данных Record с различными полями в зависимости от ввода пользователя .Это проблема, с которой я столкнулся.

Я могу обойти ее, определив все типы данных поля как data Field = Field [String] и запись как data Record = Record [Field].Однако мне нужно больше контроля над типом данных, таким как день как тип Day и номер идентификатора как тип Int.

Если создается тип данных Record с различными полями в зависимости отввод невозможен, может быть есть другие способы решения моей проблемы.Я ценю любые советы!И извините за длинное описание моей проблемы и мои неоднозначные описания моей проблемы раньше!

1 Ответ

0 голосов
/ 21 ноября 2018

Ну, если я правильно понял ваш вопрос, нет, вы не можете написать одну функцию, которая возвращает разные типы данных в зависимости от ввода. Однако то, что вы можете сделать, это написать функцию, которая возвращает один тип данных, который может быть сконструирован различными способами в зависимости от ввода. То есть, например:

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

так что теперь вы можете написать функцию parseRecord :: String -> Maybe PatentRecord, например, которая анализирует ваш ввод и в зависимости от того, что он соответствует, возвращает PatentRecord, построенный с использованием конструктора PN, или конструктора AN, и т. Д ...

PS: Совет по реализации: используйте Either SomeErrorType вместо Maybe, чтобы предоставить более полную информацию при ошибках анализа; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...