2016-12-23 3 views
6

$ jest dozwolone w operatora niestandardowego, ale jeśli spróbujesz użyć $$, <$> lub na przykład ~$% jako nazwę operatora otrzymasz następujący błąd:

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

$ wyraźnie ma również „$” w nazwa, ale działa, dlaczego? tj .:

let inline ($) f y = f y 

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

widzę $ wiele przykładów w Internecie i najwyraźniej jako szczególny rodzaj operatora. Co to jest leczenie szpiegowskie lub rola dla $ (tj. W Haskell lub OCaml) i co powinien zrobić <$>, jeśli było to dozwolone (edycja)?

Próba oszukania systemu poprzez utworzenie funkcji takiej jak op_DollarDollar, nie działa, sprawdzanie składni odbywa się również na stronie połączenia. Choć jako przykład, ta sztuczka działa z innymi operatorami (prawnych):

// 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

Tak, to samo nie możemy określić standard '' '' <$> operatora w F #. Powinniśmy złożyć wniosek o zezwolenie tym operatorom. – Gustavo

+1

':' jest również na liście. ['$'] (https://github.com/Microsoft/visualfsharp/blob/6afc4f9776a5dba903ca6b11965a206fb8bc23d8/src/fsharp/lex.fsl#L117) i [':'] (https://github.com/Microsoft/visualfsharp /blob/6afc4f9776a5dba903ca6b11965a206fb8bc23d8/src/fsharp/lex.fsl#L115) –

+0

@guy, dla ':' Rozumiem to nieco, ponieważ ':>' i ':?>' prawdopodobnie nie powinny być zastępowalne. Mógłbym powiedzieć to samo dla '::', ale ponieważ '@' jest nadpisywalne i '..' jest zbyt (zaskakujące, ale prawdziwe), zakładam tylko, że' :: 'nie jest spowodowane ochroną przed okrężnicami operatorów. – Abel

Odpowiedz

4

Jest jakaś sprzeczność w F# specification wokół tego punktu. Sekcja 3.7 F # ​​specyfikacji definiuje operatorów symboliczne jako

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 

(i $ również nie pojawia się jako symboliczne słowa kluczowego w sekcji 3.6), który wskazywałby, że to jest złe dla kompilatora, aby zaakceptować ($) jako operator.

Jednak sekcja 4.4 (która obejmuje pierwszeństwo operatora) zawiera następujące definicje:

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 
    ? 

i następującą tabelą pierwszeństwa i skojarzeń niezawierającego $ (ale nie wskazuje, że $ może pojawić się jako jeden znak na dłużej operator symboliczny). Rozważ złożenie błędu, aby specyfikacja mogła być spójna w taki czy inny sposób.

+0

Dzięki. Wiedziałem, że masz ostateczną odpowiedź. –

+0

Miłego wypoczynku. :) –

+0

@GuyCoder - dzięki, też! – kvb

Powiązane problemy