Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Some years ago I also wanted to make ocaml my primary language, but rapidly encountered problems: difficulty to install (on Linux due to the requirement of a very unusual tool which name and function I forgot), no response from community regarding how to solve that problem, no solid postgresql driver, ....

Wanting to use a functional language I pivoted to fsharp, which was not the expected choice for me as I use Linux exclusively. I have been happy with this choice, it has even become my preferred language. The biggest problem for me was the management of the fsharp community, the second class citizen position of fsharp in the DotNet ecosystem, and Microsoft's action screwing the goodwill of the dev community (eg hot reload episode). I feel this hampered the growth of the fsharp community.

I'm now starting to use rust, and the contrast on these points couldn't be bigger.

Edit: downvoters, caring to share why? I thought sharing my experience would have been appreciated. Would like to know why I was wrong.



> difficulty to install

Use opam: https://opam.ocaml.org or https://opam.ocaml.org/doc/Install.html.

Additionally, see: https://ocaml.org/install#linux_mac_bsd and https://ocaml.org/docs/set-up-editor.

It is easy to set up with Emacs, for example. VSCodium has OCaml extension as well.

All you need for the OCaml compiler is opam, it handles all the packages and the compiler.

For your project, use dune: https://dune.readthedocs.io/en/stable/quick-start.html.


"use opam" is always the answer but in reality its the worst package manager ever. I've never seen so many packages fail to install, so many broken dependencies and miscompilations that resulted in segfaults due to wrong dependencies. I just gave up with Ocaml due to the crappy ecosystem, although I could have lived with the other idiosyncrasies.


And even if you do get opam working for a project, it's not at all reproducible and will just randomly break at some point in the future. For instance, I had this in a Dockerfile for one project:

  RUN eval $(opam env) && opam install --yes dune=3.7.0
One day the build just randomly broke. Had to replace it with this:

  RUN eval $(opam env) && opam install --yes dune=3.19.1
Not a big change, but the fact that this happens at all is just another part of building with OCaml feeling like building on a foundation of sand. Modern languages have at least learned how to make things reproducible with e.g. lockfiles, but OCaml has not.


Use "opam lock" and "opam pin". Additionally, Dune's lockdir feature uses opam's solver internally to generate a lock directory containing ".opam.locked" files for every dependency. This is Dune's way of having fully reproducible builds without relying on opam's switch state alone.

Additionally, see: https://dune.readthedocs.io/en/stable/tutorials/dune-package....


No, the problem is that dune=3.7.0 got removed from the registry entirely.


Yes, the opam repository has recently been working on an archival policy to reduce the size of the checkout and hopefully ease pressure on the dependency resolver by pruning 'obviously' wrong choices. However, the heuristic they chose seems to have mainly assumed that the things in the repository are libraries, and used dependencies for tracking usages. For executables like dune, this is obviously the wrong idea, and I think they're still deciding how to proceed while adding back most versions


It is still there according to "opam show dune --all-versions", so no, it has not been removed.

Anyways, what you could do is:

  opam pin add dune 3.7.0
  opam install dune
Alternatively, you can use the tarball directly:

  opam pin add dune https://github.com/ocaml/dune/releases/download/3.7.0/dune-3.7.0.tbz


I tried going back to change my Dockerfile to see if that would work, and it did not:

  RUN eval $(opam env) && opam pin add dune 3.7.0 && opam install --yes dune
Similar error to before:

  [ERROR] Package dune has no known version 3.7.0 in the repositories
You're right that I could change it to grab directly from GitHub, but at that point I can also just change it to a different version of Dune, as I said above. None of this negates my original point.


What if you do "opam update" before?


I already do: https://github.com/gradbench/gradbench/blob/0276272d0df5be19...

And the CI build doesn't use Docker caching, so no shenanigans there.


Actually, I did an "opam update" (after my comment that stated there was "3.7.0") and "opam show dune --all-versions" no longer shows "3.7.0". :|

It shows:

  all-versions         1.6.3  1.9.3  1.11.4  2.3.0  2.4.0  2.5.1  2.6.1  2.7.1
                       2.9.3  3.5.0  3.6.2  3.10.0  3.12.1  3.12.2  3.15.3
                       3.17.2  3.18.2  3.19.0  3.19.1
You are right! So I suppose it is either 3.6.2 or 3.10.0. Can you use either of these versions?

Your alternative really is:

  $ opam pin add dune https://github.com/ocaml/dune/releases/download/3.7.0/dune-3.7.0.tbz
If you really must need "3.7.0".

Just FWIW, maybe it might work the way you wanted it to if you do not update the registry; worth a try. It should be able to fetch the correct tarball.


There is a lot of work on Dune Package Management that will fix some legacy issues related to OPAM, https://dune.readthedocs.io/en/stable/tutorials/dune-package... !! Stay tuned!


Dune is not a dependency manager, it is a build tool. Opam is the dependency manager. By default, Dune doesn't fetch dependencies, opam does that. That said, Dune does use opam, yeah.


And the next milestone of Dune is to become an alternative package manager via Dune package Management, using a store in a "nixish" way.


I suppose it is still going to use opam internally, right?


No, it is doing its own package management implementation.


So dune is going to replace opam? Where can I read more about this if so?



Package description, but it use its own engine.


I have never had issues and been writing OCaml and using opam for years.

Can you be more specific?

(Why the down-vote? He does need to be specific, right? Additionally, my experiences are somehow invalid?)


I mean, it's quite clunky, but on Linux or WSL I've never had the broken experience you talk about. Could you share your setup? Was this maybe on bare macOS or Windows, in which case I totally believe it because they've been neglected?


No, just Linux or inside Docker (on Linux).


I abandoned ocaml just because I couldn't get a stepping debugger to work. Can't remember the exact issues but I tried to install in vscode to no avail & I've no interest in emacs




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: