2016-12-23 4 views
6

$는 사용자 정의 연산자에서 허용되지만, 운영자 이름은 다음과 같은 오류가 나타납니다 당신은 $$, <$> 또는 인스턴스 ~$%을 위해 사용하려고하는 경우 : 명확하게

error FS0035: This construct is deprecated: '$' is not permitted as a character in operator names and is reserved for future use

$를 또한 '$'에있다이라는 이름이 붙어 있지만 작동하는 이유는 무엇입니까? 즉 :

let inline ($) f y = f y 

// using it works just fine: 
let test = 
    let add x = x + 1 
    add $ 12 

내가 온라인 예제에서 분명히 운영자의 특정 종류로 $ 많이 참조하십시오. $ (즉, 하스켈 또는 OCaml)에 대한이 치료 또는 역할은 무엇이며 <$>은 허용 된 경우 어떻게해야합니까 (편집)?

op_DollarDollar과 같은 기능을 생성하여 시스템을 속일려고해도 호출 사이트에서 구문 검사가 수행됩니다. 비록 예를 들어,이 트릭은 다른 (법적) 사업자와 함께 작동합니까 :이 시점 주위 F# specification에 약간의 불일치가있다

// works 
let inline op_BarQmark f y = f y 
let test = 
    let add x = x + 1 
    add |? 12 

// also works: 
let inline op_Dollar f y = f y 
let test = 
    let add x = seq { yield x + 1 } 
    add $ 12 
+0

네, F #에서 표준''<$>''연산자를 정의 할 수 없습니다. 우리는 이러한 통신 수 있도록 요청을 제출해야합니다. – Gustavo

+1

':'도 목록에 있습니다. ['$'] (https://github.com/Microsoft/visualfsharp/blob/6afc4f9776a5dba903ca6b11965a206fb8bc23d8/src/fsharp/lex.fsl#L117) 및 [':'] (https://github.com/Microsoft/visualfsharp) /blob/6afc4f9776a5dba903ca6b11965a206fb8bc23d8/src/fsharp/lex.fsl#L115) –

+0

@guy, for':'':>'와':?>'는 무시할 수 없으므로 다소 이해합니다. ':'에 대해서도 같은 말을 할 수 있지만,'@'는 오버라이드 가능하고'..' 역시 (놀랍지 만 사실이기 때문에)'::'는 콜론과 관련된 보호 때문에 존재하지 않는다고 가정합니다 연산자. – Abel

답변

4

. 은 F # 사양의 3.7 컴파일러는 연산자로 ($)을받는 것이 잘못 있음을 나타냅니다 (섹션 3.6의 상징적 인 키워드로 나타나지도 및 $)

regexp first-op-char = !%&*+-./<=>@^|~ 
regexp op-char  = first-op-char | ? 

token quote-op-left = 
    | <@ <@@ 

token quote-op-right = 
    | @> @@> 

token symbolic-op = 
    | ? 
    | ?<- 
    | first-op-char op-char* 
    | quote-op-left 
    | quote-op-right 

로 상징적 인 연산자를 정의합니다. $ 더 이상 하나 개의 문자로 표시 할 수있는

infix-or-prefix-op := 
    +, -, +., -., %, &, && 

prefix-op := 
    infix-or-prefix-op 
    ~ ~~ ~~~    (and any repetitions of ~) 
    !OP     (except !=) 

infix-op := 
    infix-or-prefix-op 
    -OP +OP || <OP >OP = |OP &OP ^OP *OP /OP %OP != 
         (or any of these preceded by one or more ‘.’) 
    := 
    :: 
    $ 
    or 
    ? 

$를 (포함 않는 우선 순위와의 다음 표하지만 표시 :

그러나, 섹션 4.4 (운영자 우선 덮는)이 정의를 포함 기호 연산자). spec을 일관되게 만들 수 있도록 버그를 제기하는 것이 좋습니다.

+0

고마워요. 나는 당신이 확실한 답을 얻을 줄 알았습니다. –

+0

멋진 휴가 보내십시오. :) –

+0

@GuyCoder - 고마워, 너도! – kvb