I think you're attempting to optimize the wrong thing. In a dynamic language like Ruby, this approach makes sense because download times are a significant fraction of the user's time, and otherwise the user experience isn't affected much because the code is basically interpreted either way.<div><br></div><div>Haskell is primarily a compiled language. The total download size probably won't be significantly larger from downloading all modules. The cost of recompiling/dynamically loading plugins will be expensive (relative to the rest of the user time), and payed with every execution. Plus it's additional work for the developer to set up.</div><div><br></div><div>In all likelihood you should just build a binary with all available strategies and distribute that.<br><br><div class="gmail_quote"><div dir="ltr">On Sun, Jul 22, 2018, 08:27 Marc Busqué <<a href="mailto:marc@lamarciana.com">marc@lamarciana.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi there,<br>
<br>
I'm currently programming my first non toy project in Haskell. I come from Ruby<br>
background, where everything is possible no matter how much entropy the<br>
universe gains after you finish your work, so I'm still not sure how to do<br>
certain things without this side-effect :)<br>
<br>
I'll try to be concise. My idea is that the project would consist of several<br>
different Haskell packages. The central one, call it Core, would define a<br>
certain data type (with info about certain URLs). Other packages would define<br>
each one an strategy to do something with that data type (processing the URL<br>
info). Each strategy would have its own dependencies, and as a user probably<br>
won't need all of the strategies, I would like to keep them in separated<br>
packages so she or he has no need to download the unneeded stuff.<br>
<br>
The problem is that Core should act as the central dashboard, whether through a<br>
CLI or even a web frontend. For example, in the CLI case, I would like to be<br>
able to install Core package along with package StrategyA and package StrategyB<br>
and then do something like the following:<br>
<br>
``` <br>
bash> core --action=fetch --strategy=A<br>
bash> core --action=fetch --strategy=B<br>
```<br>
<br>
Two generic ideas come to my mind but I don't know how to translate them<br>
to Haskell:<br>
<br>
- Infer module name from the `--strategy` argument and call it dynamically.<br>
   However, as far as I know, in Haskell modules are not first class citizens,<br>
   so no way I can dynamically call them. I have read something to achieve this<br>
   through Template Haskell or through outdaded<br>
   [plugins](<a href="http://hackage.haskell.org/package/plugins" rel="noreferrer" target="_blank">http://hackage.haskell.org/package/plugins</a>) package, but I'm not<br>
   sure whether the need is the same and anyway it seems quite unnatural to<br>
   Haskell (I would not like to go against it, but to learn to do thing in its<br>
   way).<br>
<br>
- Define from Core some kind of global list where strategy packages can<br>
   register a map between CLI argument value and a defined instance of the core<br>
   data type. But, again, how to do global things in Haskell (and I would prefer<br>
   not to need external tools like RDBMS, filesystem or whatever)? And, anyway,<br>
   surely I don't want to do this because concurrency and everything...<br>
<br>
Any idea?<br>
<br>
Thanks in advance!<br>
<br>
Marc Busqué<br>
<a href="http://waiting-for-dev.github.io/about/" rel="noreferrer" target="_blank">http://waiting-for-dev.github.io/about/</a>_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div></div>