niewielką część kodu, aby podkreślić problem:Zmiękczanie z „elastycznych typów” w 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!
Może ktoś wyjaśnić, dlaczego jest zachowanie kompilator tak różne w ostatnich dwóch wierszach? I dlaczego straciliśmy informacje (o elastyczności #Stream
) w funkcji test_currying
?
To jest prawidłowe zachowanie, prawda? – qehgt
Nie sądzę, że to, co obecnie robi kompilator, jest poprawnym zachowaniem. Nie widzę powodu, dla którego te dwie sprawy powinny zachowywać się inaczej. Dlatego powiedziałem, że wygląda mi na błąd. –
Ok, widzę. Dzięki. – qehgt