2016-12-23 39 views
6

$ özel operatör izin, ancak operatör adı aşağıdaki hatayı alırsınız gibi $$, <$> veya örneğin ~$% için kullanmaya çalışırsanız: açıkça

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

$da '$' sahip olduğu ismi, ama işe yarıyor, neden? yani .:

let inline ($) f y = f y 

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

Online örneklerde ve görünüşe operatörün belirli bir tür olarak $ çok görüyoruz. Ne (yani Haskell veya OCaml değil) bu spcial tedavi veya $ için rolü olduğunu ve (edit) izin verildi eğer <$> ne yapmalıyım?

op_DollarDollar gibi bir işlev oluşturarak sistemi kandırmaya çalışmak, uçmazsa, sözdizimi denetimi çağrı sitesinde de yapılır. Gerçi bir örnek olarak, bu hüner diğer (yasal) operatörleri ile çalışır: bu nokta etrafında F# specification bazı tutarsızlık var

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

Evet, aynı standart olan '' <$> '' operatörünü F # olarak tanımlayamıyoruz. Bu operatörlere izin vermek için bir istek göndermeliyiz. – Gustavo

+1

':' ayrıca listede yer alıyor. ['$'] (https://github.com/Microsoft/visualfsharp/blob/6afc4f9776a5dba903ca6b11965a206fb8bc23d8/src/fsharp/lex.fsl#L117) ve [':'] (https://github.com/Microsoft/visualfsharp /blob/6afc4f9776a5dba903ca6b11965a206fb8bc23d8/src/fsharp/lex.fsl#L115) –

+0

@guy, ':' Ben biraz anlıyorum, çünkü ':>' ve ':?>' muhtemelen büyük olasılıkla geçersiz kılmamalıdır. Ben aynı söyleyebiliriz '::' fakat '@' beri sadece değil çünkü kolon ile ilişkili korumalı taşımaktadır '::' varsayılabilir ..' çok (şaşırtıcı ama gerçek) 'dir 'geçersiz kılınabilir ve operatörler. – Abel

cevap

4

. F # spec Bölüm 3.7 derleyici bir operatör olarak ($) kabul etmek için bunun yanlış olduğunu belirtmek istiyorum, (bölüm 3.6 sembolik anahtar kelime olarak görünmüyor da ve $)

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 

olarak sembolik operatörlerini tanımlar. $ artık bir karakter olarak görünebilir olduğu

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 
    ? 

ve $ (ihtiva etmez önceliği ve birleşim aşağıdaki tablo, ancak hiçbir gösterge:

Ancak, bölüm 4.4 (operatör öncelik kapsar) bu tanımları içermektedir sembolik operatör). Bir hatayı dosyalamayı düşünün, böylece özellik bir şekilde ya da diğeriyle tutarlı hale getirilebilir.

+0

Teşekkürler. Kesin bir cevabın olacağını biliyordum. –

+0

İyi tatiller. :) –

+0

@GuyCoder - teşekkürler, siz de! – kvb