OCaml Gripes
Gripes with OCaml:
- Types that are declared in an interface file also need to be redeclared in the implementation file.
let
is stranger word thanfun
(as in SML) for declaring functions- OCamlMakefile doesn't detect dependencies if the interface file is not mentioned in
SOURCES
; "X and Y have inconsistent assumptions" - No built-in "compose" combinator, can't use
o
(as in SML) or.
(as in Haskell) - No
before
form as in SML (very useful when debugging, checking return values) - a record type cannot be given directly within a variant constructor declaration (e.g.
Foo of {field : string}
). - Syntax errors are often unhelpful (
Syntax error
) - Never helpfully points out that you might've partially applied a function when you meant to fully apply it (Haskell does help in this way!).
- Interactive shell is very difficult to use:
- It is picky about terminating each expression with exactly two semicolons.
- There are lots of special commands for loading modules (
open FooModule
is never enough) and they have different conventions: for example, some begin with # and require an exact filename. I never know what file needs to be#load
ed.
- The build system detects when a module's interface has changed, but forces programmer to do something about it.
- The built-in regexp interface is very clunky:
Str.quote
needlessly returns a string instead of a regexp, requiring me to then callStr.regexp
whenever I use it.Str.string_match
needlessly requires an integer argument designating the index at which I'd like to start matching. This should, of course, be an optional argument or a distinct form of the function (Perl seems to havegotten along okaytaken over the world without a silly index argument on regex matching).
- The
Map
module for finite maps provides amap
function for transforming the domain of the map, but doesn't provide a way to transform the keys.