F #: Имена значений с двойными обратными кавычками конфликтуют с именами функций?

В Visual Studio 2015:

let myFunction (``string`` : string) =
    "\"Quoted string\"" |> (Regex "\"[^\"]*\"").Match |> string

let myOtherFunction (str : string) =
    "\"Quoted string\"" |> (Regex "\"[^\"]*\"").Match |> string

Первая функция генерирует ошибку компилятора, функция string подчеркнута красным. («Ожидалось, что это выражение будет иметь тип Match -> 'a, но здесь есть строка типа»)

Вторая функция в порядке, никаких проблем.

Это задумано?


person MiloDC    schedule 22.04.2017    source источник


Ответы (1)


Причина в том, что ваш параметр и вызов в конце - это одно и то же. Двойные обратные кавычки используются для экранирования имени, они не являются частью имени.

Итак, в вашем случае это означает, что ``string`` и string - это одно и то же, вы пытаетесь передать свой строковый параметр. И да, это полностью задумано.

Эквивалент C # - это имена с @ -экранированием, где, например, @hello и hello будут конфликтовать.

person Nikon the Third    schedule 22.04.2017
comment
И, на самом деле, двойные обратные кавычки здесь вообще не нужны. Вы могли бы написать let upper (string : string) = string.ToUpper(), и это сработало бы: upper "foo" даст результат "FOO". Двойные обратные кавычки необходимы только в том случае, если вы хотите назвать свой параметр именем ключевого слова, например type, или если вы хотите включить в его имя пробелы или другие обычно недопустимые знаки препинания. - person rmunn; 22.04.2017