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