Penso che la tua domanda è se una funzione point-free può essere inline o meno.
La limitazione trovata non è dovuta alla funzione al curry. Nota che nel tuo esempio la funzione al curry è sul lato destro, sul lato sinistro hai una funzione point-free.
F # consente solo alle funzioni di essere in linea, non di costanti.
Principalmente si può pensare che questo possa essere considerato un errore dato che l'inferenza di tipo è abbastanza intelligente da scoprire che è una funzione (senza punto), ma leggere le note di Tomas relative agli effetti collaterali.
quanto pare quando il compilatore trova sul lato sinistro solo un identificatore viene a mancare con questo errore:
let inline myfunction x y = x + y
let inline mycurried = myfunction 1
--> Only functions may be marked 'inline'
Come Brian ha detto una soluzione alternativa è l'aggiunta di un parametro esplicito su entrambi i lati:
let inline mycurried x = (myfunction 1) x
ma la tua funzione non è più point-free, è la stessa di:
let inline mycurried x = myfunction 1 x
Un altro modo potrebbe essere quello di aggiungere un parametro generico esplicito:
let inline mycurried<'a> = myfunction 1
quando i parametri generici sono presenti in modo esplicito sul lato sinistro si compila.
Vorrei che rimuovono il messaggio di errore e di trasformarlo un avvertimento, qualcosa come:
Since only functions can be 'inline' this value will be compiled as a function.
UPDATE
Grazie Tomas per la risposta (e il tuo downvote).
La mia opinione personale è che questo dovrebbe essere un avvertimento, quindi sei consapevole che la semantica del tuo codice cambierà, ma poi spetta a te decidere cosa fare.
Lei dice che in linea è "solo un'ottimizzazione" ma non è del tutto vero:
. Basta trasformare tutte le funzioni in linea non garantisce un codice ottimale.
. Potresti voler usare i vincoli statici e quindi devi usare in linea.
Mi piacerebbe essere in grado di definire le mie costanti generiche (tipo), come già fa la libreria F # (cioè: GenericZero e GenericOne). So che il mio codice sarà puro, quindi non mi interessa se viene eseguito ogni volta.
Si noti che la modifica del let let da un _value_ ('let x = ...') a un _function_ ('let x arg = ...') può cambiare il significato della funzione se l'espressione utilizzata per calcolare il la funzione ha alcuni effetti. Nel primo caso, gli effetti saranno valutati una volta e nel secondo, saranno valutati ripetutamente. Se vuoi che gli effetti vengano valutati solo una volta, non puoi usare 'inline'. Se si desidera eseguirli più volte, penso che sia corretto aggiungere un parametro aggiuntivo. –
L'aggiunta di un parametro generico è _molto sottile_ perché assomiglia ancora a un valore, ma in realtà si comporta come una funzione (vale a dire che gli effetti vengono valutati ripetutamente), quindi non lo consiglierei. (A parte questo, sono abbastanza sicuro che il comportamento è in realtà indefinito - cioè una versione futura del compilatore potrebbe decidere di valutare gli effetti solo una volta per ogni argomento di tipo generico). –
Il messaggio di errore non ha senso in lingue pure (come Haskell), ma penso che impedirti di modificare accidentalmente il comportamento del tuo programma quando aggiungi 'inline' solo per ottimizzarlo è un'ottima decisione. –