You can simplify the function by removing the map and adding a dynamic downcast to 'a in the return expression of the seq comprehension.
Whether both parameters are required really depends on how you want to use this function. My guess is that both 'a and t are meant to refer to the same type, this type is statically known, it is an interface or abstract class, and implementations of it will be found in the plugin assemblies. In which case you can remove the t parameter and replace occurances of t with
See also [link:cs.hubfs.net] for a similar problem.
Whether both parameters are required really depends on how you want to use this function. My guess is that both 'a and t are meant to refer to the same type, this type is statically known, it is an interface or abstract class, and implementations of it will be found in the plugin assemblies. In which case you can remove the t parameter and replace occurances of t with
(type 'a). So your code might be written aslet create<'a> (mgr: PluginManager) =
{ for x in assemblies mgr
for y in HA.types x
when Helper.is_a (type 'a) y
-> (HA.domain x).CreateInstanceAndUnwrap((HA.assembly x).FullName, y.FullName) :?> 'a}See also [link:cs.hubfs.net] for a similar problem.
Hi,
You are correct in that
I am actually the person who had started that last thread you reference as well :). Unluckily, the little gem
Thank you very much for the answer, as I will be putting it to use immediately. I'm getting on quite well with F#, but there are still certain areas such as types (obviously), events and so on that confuse me with regards to how F# and the rest of .net interact.
Thanks again,
z.
You are correct in that
'a and t refer to the same statically known type (which is an abstract class/interface).I am actually the person who had started that last thread you reference as well :). Unluckily, the little gem
(type 'a) didn't make it into the last thread, and I have just returned to working on that library after a long break.Thank you very much for the answer, as I will be putting it to use immediately. I'm getting on quite well with F#, but there are still certain areas such as types (obviously), events and so on that confuse me with regards to how F# and the rest of .net interact.
Thanks again,
z.
Topic tags
- f# × 3658
- compiler × 263
- functional × 199
- c# × 119
- websharper × 113
- classes × 96
- web × 94
- book × 84
- .net × 82
- async × 72
- parallel × 43
- server × 43
- parsing × 41
- testing × 41
- asynchronous × 30
- monad × 28
- ocaml × 26
- tutorial × 26
- haskell × 25
- workflows × 22
- html × 21
- linq × 21
- introduction × 19
- silverlight × 19
- wpf × 19
- fpish × 18
- collections × 14
- pipeline × 14
- templates × 12
- monads × 11
- opinion × 10
- reactive × 10
- plugin × 9
- scheme × 9
- sitelets × 9
- solid × 9
- basics × 8
- concurrent × 8
- deployment × 8
- how-to × 8
- python × 8
- complexity × 7
- javascript × 6
- jquery × 6
- lisp × 6
- real-world × 6
- workshop × 6
- xaml × 6
- conference × 5
- dsl × 5
- java × 5
- metaprogramming × 5
- ml × 5
- scala × 5
- visual studio × 5
- formlets × 4
- fsi × 4
- lift × 4
- sql × 4
- teaching × 4
- alt.net × 3
- aml × 3
- enhancement × 3
- list × 3
- reflection × 3
- blog × 2
- compilation × 2
- computation expressions × 2
- corporate × 2
- courses × 2
- cufp × 2
- enterprise × 2
- entity framework × 2
- erlang × 2
- events × 2
- f# interactive × 2
- fsc × 2
- google maps × 2
- html5 × 2
- http × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- keynote × 2
- mvc × 2
- numeric × 2
- obfuscation × 2
- oop × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- rx × 2
- script × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- type × 2
- type provider × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- addin × 1
- agents × 1
- agile × 1
- android × 1
- anonymous object × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net mvc × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- b-tree × 1
- bistro × 1
- bug × 1
- camtasia studio × 1
- canvas × 1
- class × 1
- client × 1
- clojure × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- combinator × 1
- confirm × 1
- constructor × 1
- continuation-passing style × 1
- coords × 1
- coursera × 1
- csla × 1
- css × 1
- data × 1
- database × 1
- declarative × 1
- delete × 1
- dhtmlx × 1
- discriminated union × 1
- distance × 1
- docs × 1
- documentation × 1
- dol × 1
- domain × 1
- du × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- error × 1
- etw × 1
- euclidean × 1
- event × 1
- example × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- fantomas × 1
- fear × 1
- float × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- function × 1
- functional style × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- google × 1
- group × 1
- hash × 1
- history × 1
- hosting × 1
- httpcontext × 1
- https × 1
- hubfs × 1
- ie 8 × 1
- if-doc × 1
- inheritance × 1
- installer × 1
- interpreter × 1
- io × 1
- ios × 1
- ipad × 1
- kendo × 1
- learning × 1
- licensing × 1
- macro × 1
- macros × 1
- maps × 1
- markup × 1
- marshal × 1
- math × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- multidimensional × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- nested × 1
- nested loops × 1
- node × 1
- object relation mapper × 1
- object-oriented × 1
- offline × 1
- option × 1
- orm × 1
- osx × 1
- owin × 1
- paper × 1
- parameter × 1
- performance × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- programming × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- ptvs × 1
- quant × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- real-time × 1
- reference × 1
- restful × 1
- round table × 1
- runtime × 1
- scriptcs × 1
- scripting × 1
- service × 1
- session-state × 1
- sitelet × 1
- stickynotes × 1
- stress × 1
- strong name × 1
- structures × 1
- tdd × 1
- template × 1
- tracing × 1
- tsunamiide × 1
- type inference × 1
- type providers × 1
- upload × 1
- vb × 1
- vb.net × 1
- vector × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio shell × 1
- visualstudio × 1
- web api × 1
- webapi × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- xml × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us |
Built with WebSharper |
I'm still working on a plugin manager, and have a question about the following function. Basically, this function takes in a type
tand a plugin managermgr. It goes through each types within each assembly loaded into the manager, and creates an instance should the desired type be in the assembly type's inheritance tree. Now, the reason I added in a parameter'ais so that I can return aseq<'a>instead of justseq<obj>.So, my question is, are both parameters required or is there a way to simplify this function?
let create<'a> t (mgr: PluginManager) = { for x in assemblies mgr for y in HA.types x when Helper.is_a t y -> (HA.domain x). CreateInstanceAndUnwrap((HA.assembly x).FullName, y.FullName) } |> Seq.map (function :? 'a as z -> z)Thanks and regards,
z.