Piccola parte di un codice per evidenziare il problema:accattivarsi dei 'tipi flessibili' in F #
open System.IO
let do_smth i (stm : #System.IO.Stream) = // val do_smth : 'a -> #Stream -> unit
(*....*)
()
type SomeOps = SomeOps with
static member op (i : int) = do_smth i
let test_currying i = do_smth i // val test_currying : 'a -> (Stream -> unit)
// NB: Stream, not #Stream
let main() =
use stm = new System.IO.MemoryStream()
test_currying 42 stm // OK, upcasted to Stream somehow
SomeOps.op 42 stm // compiler error!
qualcuno può spiegare, perché è il comportamento del compilatore in modo diverso negli ultimi due righe? E perché abbiamo perso le informazioni (sulla flessibile #Stream
) nella funzione test_currying
?
Quindi, è un comportamento corretto, giusto? – qehgt
Non penso che ciò che fa il compilatore al momento sia un comportamento corretto. Non vedo una ragione per cui i due casi dovrebbero comportarsi diversamente. Ecco perché ho detto che mi sembra un insetto. –
Ok, capisco. Grazie. – qehgt