F # noob: сопоставление командной строки args

Начало обучения F #. Хотите сделать простую программу, которая просто подскажет мне, что она нашла в командной строке args. У меня есть:

[<EntryPoint>]
let main argv = 
    printfn "%A" argv
    match argv with
    | []  -> 42
    | _ -> 43

Но это дает ошибки. Если я навис над argv, я вижу:

val argv: string []

что я и ожидал (список строк). Однако первое выражение выражения имеет ошибку:

Ошибка 1 Это выражение должно было иметь тип     string [], но здесь есть тип     'список

В принципе, я просто хочу совместить пустой список аргументов (пустой список строк). Какой правильный способ сделать это?

Я должен добавить: я не просто хочу решение (хотя это было бы неплохо). Я также хочу понять, что здесь ищет компилятор, который я не даю.

Ответ 1

Это может сбивать с толку, поскольку [] literal используется для обозначения пустого списка, но type string [] - это массив строк, а не список.

Вы можете сопоставить шаблон с массивом следующим образом:

[<EntryPoint>]
let main argv = 
    printfn "%A" argv
    match argv with
    | [||]  -> 42
    | _ -> 43

Как и многие, казалось бы, непоследовательные вещи в F #, это результат его двойного наследия.

В OCaml вы должны использовать int list и int array для типов, [1;2;3] и [|1;2;3|] для значений соответственно. Но в С#/.NET квадратные скобки как в int[] - это способ указать, что вы имеете дело с массивом.

Вероятно, чтобы попытаться быть более доступным для толпы .NET, в именах типов F # использует [] как псевдоним для array, поэтому обе формы могут использоваться. Очень печально, что это совпадает с пустым литералом списка, но оставляя это "как есть" еще одним ограничением - одна из ранних целей в дизайне F # заключалась в том, чтобы сделать его совместимым с кодом OCaml, так что перенос с этого языка на F # является трением как можно меньше.