2016-06-30 4 views
6

Ad esempio, il seguente non è consentito, e non so perché:Perché il tipo di funzione di prima classe non può contenere byrefs?

> let f() = 
    let f2 (a : byref<int>) = 
     () 
    let mutable a = 0 
    f2 &a;; 

La mia ipotesi è che il ByRef potrebbe essere un riferimento mutabile a una variabile di stack, che potrebbe andare fuori del campo di applicazione se f2 decide di memorizzarlo da qualche parte. O è qualcos'altro?

+2

Che errore ottieni? –

+0

'> let f() = let f2 (a: byref ) = () let mutable a = 0 f2 & a ;; () -------- ^^ C: \ Users \ mfaiza \ AppData \ Local \ Temp \ stdin (21,9): errore FS0425: il tipo di una funzione di prima classe non può contenere byrefs' –

+3

Beh, questa è solo una limitazione della lingua. Ha a che fare con l'idea di una funzione come qualcosa che prende un input e produce un output, e un parametro 'byref' non è esattamente un" input ", ma piuttosto sia input + output. Se vuoi che la funzione muti una cella, basta che restituisca il valore modificato. –

risposta

9

Il sistema di tipo .NET non consente l'utilizzo di tipi di tipo rrif come argomenti di tipo generico (ad esempio non è possibile creare un valore List<byref<int>>). Poiché le funzioni F # (di prima classe) sono in realtà istanze del tipo FSharpFunc<_,_>, ciò significa che anche le funzioni F # non possono utilizzare byrefs nel proprio dominio o intervallo.

0

L'errore sembra derivare dal fatto che si sta dichiarando f2 come una funzione nidificata. Se lo estrai da f, compila:

let f2 (a : int byref) =() 

let f() = 
    let mutable a = 1 
    f2 &a 
Problemi correlati