2017-04-22 9 views
4

:F # : 두 개의 역으로 ​​된 값 이름이 함수 이름과 충돌합니까? 비주얼 스튜디오 2015

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

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

첫 번째 함수는 컴파일러 에러를 발생은 string 함수 빨간색 밑줄된다. ("이 표현식은 일치 유형 -> 'a가 있어야하지만 여기에는 유형 문자열이 있습니다.)

두 번째 기능은 문제가 없지만 아무 문제가 없습니다. 이것은 의도적으로 설계된 것입니까?

답변

5

이유는 매개 변수와 끝 부분의 호출이 같은 이유입니다. 이중 백틱은 이름을 이스케이프하는 데 사용되며 이라는 이름의 일부가 아닙니다.

그렇다면 ``string``string이 정확히 똑같은 것을 의미하므로 문자열 매개 변수로 파이프하려고합니다. 그리고 네, 이것은 완전히 설계된 것입니다.

C#은 동일한 @ -escaped 이름입니다. 예를 들어 @hellohello이 충돌합니다.

+1

사실, 이중 백틱이 전혀 필요하지 않습니다. 'let upper (string : string) = string.ToUpper()'라고 쓰면 효과가 있었을 것입니다 :'upper "foo"'결과 "FOO"를 생성합니다. double-backticks가 ** 필요한 ** 유일한 시간은'type'과 같은 키워드 이름으로 매개 변수의 이름을 지정하거나 이름에 공백이나 기타 일반적으로 불법적 인 구두점을 포함하려는 경우입니다. – rmunn