Я пытаюсь разобрать аргументы командной строки в приложении 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"
перед каждым пунктом.
Есть ли лучший вариант / шаблон для такого рода вещей? Я думаю, что это общая проблема, и должен быть хороший способ справиться с ней.