Я пытаюсь проанализировать аргументы командной строки в приложении F #. Я использую сопоставление шаблонов по списку параметров, чтобы выполнить его. Что-то вроде:
let rec parseCmdLnArgs =
function
| [] -> { OutputFile = None ; OtherParam = None }
| "/out" :: fileName :: rest -> let parsedRest = parseCmdLnArgs rest
{ OutputFile = Some(fileName) with parsedRest }
Проблема заключается в том, что я хочу, чтобы "/out"
соответствовал регистру без учета, сохраняя случай других вещей. Это означает, что я не могу изменить вход и сопоставить строчную версию ввода с ней (это потеряет информацию о случае fileName
).
Я подумал о нескольких решениях:
- Прибегать к предложениям
when
, которые являются менее идеальными. - Сопоставьте кортеж каждый раз, первым будет фактический параметр (который я просто сохраню для дальнейшей обработки, и подстановочные знаки совпадают с ним), а второй будет версией с нижним регистром, используемой в таких сопоставлениях. Это выглядит хуже, чем первое.
- Используйте активные шаблоны, но это выглядит слишком много. Мне придется повторять такие вещи, как
ToLower "/out"
перед каждым элементом.
Есть ли лучший вариант/шаблон для такого рода вещей? Я думаю, что это общая проблема, и должен быть хороший способ справиться с этим.