c# - How is F#'s static bound constraints implemented? -


in f#, can perform black-magic voodoo1 , perform static typed constraints ensure function called on types have member constraints. example:

module collection     let inline init s =          let collection = new ^t()         let add e = (^t : (member add : 'a -> unit) collection, e)         seq.iter add s         collection 

this function can called type has add<'a> has signature 'a -> unit.

usage:

let a:list<_> = collection.init {1..10} let b:synchronizedcollection<_> = collection.init {1..10} |> seq.iter (fun x -> printf "%a " x) b |> seq.iter (fun x -> printf "%a " x) 

output:

1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10  

i'm interested in taking advantage of kind of functionality in c# application, have no idea kind of pitfalls or trouble can expect trying this.

in interest of avoiding x-y problem, have wcf generated client hacked manually edited mess. not using not option reasons. many types have member properties same name different types , no common type, interest in type of generic constraint.

is functionality in f# viable solution problem? how implemented? know c# can nothing this...

1not really, don't know how, question.

in f#, static member constraints (which name of voodoo) implemented inlining code of init function each time called , generating specialized code each use.

in general, .net generic constraints not rich enough express member constraints , cannot directly mapped ordinary .net generic constraints.

when write:

let a:list<_> = collection.init {1..10} let b:synchronizedcollection<_> = collection.init {1..10} 

the compiler replace collection.init body of function , replace call written using static member constraint call concrete add method of concrete type. if call appears in generic function concrete type cannot determined, not allowed.

i think use f# , static member constraints simplify working code many types share properties without deeper relationship. however, static member constraints f# specific , there no way of defining helper functions using them called c#. have write larger portion of client in f# (and perhaps expose nice clean api hides underlying types).


Comments

Popular posts from this blog

Delphi XE2 Indy10 udp client-server interchange using SendBuffer-ReceiveBuffer -

Qt ActiveX WMI QAxBase::dynamicCallHelper: ItemIndex(int): No such property in -

Enable autocomplete or intellisense in Atom editor for PHP -