/ / Errore: operatore infix imprevisto nell'espressione, relativo a un operatore prefisso compilato correttamente - f #, operatore sovraccarico, operatore prefisso, operatore infisso

Errore: operatore di imposizione imprevisto nell'espressione, su un operatore di prefisso compilato con successo - f #, overloading dell'operatore, operatore di prefisso, operatore infisso

Giocando un po 'con gli operatori infix, sono rimasto sorpreso da quanto segue:

let (>~~~) = function null -> String.Empty | s -> s  // compiles fine, see screenshot
match >~~~ input with .... // error: Unexpected infix operator in expression

val (> ~~~): stringa -> stringa)

e:

Operatore infix imprevisto

Modifica dei primi caratteri di prefisso operatore (a !~~~ per esempio) lo risolve. Che ricevo un errore che il infisso l'operatore è inaspettato è piuttosto strano. Hovering mostra la definizione da essere string -> string.

Non sono troppo sorpreso dell'errore, F #richiede (iirc) che il primo carattere di un operatore prefisso debba essere esso stesso uno degli operatori prefisso predefiniti. Ma perché si compila bene, e quando lo uso, il compilatore si lamenta?

Aggiornamento: il compilatore F # sembra sapere in altri casi bene quando uso un carattere non valido nella definizione del mio operatore, dice "Definizione operatore non valida. Le definizioni operatore prefisso devono utilizzare un nome operatore prefisso valido."

Definizione dell'operatore non valida.

risposte:

3 per risposta № 1

Le regole per gli operatori personalizzati in F # sono piuttosto rigide, quindi anche se puoi definire operatori personalizzati, ci sono molte regole su come si comporteranno e non puoi cambiarle. In particolare:

  • Solo alcuni operatori (principalmente quelli con ! e ~) può essere utilizzato come operatore prefisso. Con ~ puoi anche sovraccaricare gli operatori unari +, -, ~ e ~~, quindi se si definisce un operatore denominato ~+., puoi quindi usarlo come ad es. +. 42.
  • Altri operatori (compresi quelli che iniziano con >) può essere utilizzato solo come infisso. Puoi trasformare qualsiasi operatore in una normale funzione usando le parentesi, motivo per cui ad es. (+) 1 2 è valido.
  • Il ? i simboli sono speciali (vengono utilizzati per l'invocazione dinamica) e non possono apparire come primo simbolo di un operatore personalizzato.

Penso che il modo più intuitivo di pensare a questo sia che gli operatori personalizzati si comporteranno come operatori F # standard, ma è possibile aggiungere altri simboli dopo il nome dell'operatore standard.