The compiler converted java to x86 assembly code, and we did all of the implementation in F# (and lex and yacc with F# semantic actions) and then embedded ml.exe (MASM compiler) and link.exe (C++ linker) as resources in our binary to do the assembling and linking with the C runtime.
We had discriminated unions galore, and pattern matches to go with. Perfect for a compiler, where there are a few types, but lots of operations you want to do on those types. The Java folks were all using the Visitor pattern. Also, once we got the AST converted to a list representaiton, we could use ML's excellent list library, especially map, iter, and fold_left and fold_right.
I also made some pretty sweet uses of curried functions.
Chris is on the F# team but didn't have the FP background that I have, so he tended to use mutable state and objects more than I did. But he also knew a lot more about the language. This was great because I learned a lot more than I would have without him, even if it lead to style inconsistencies.
One cool discovery of Chris's was the pass-forward operator, |>, which allows you to chain producers and consumers like you would do piping in a shell. If this is in CAML, I never knew about it.
let outputMethodListing methodInstrs = methodInstrs |> List.map (fun (instr:Instruction) -> instr.ToString()) |> List.iter outputFile.Write
The expression to the left of the pass-forward operator is the last argument to the expression to its right. It associates left, just like the | in the UNIX or windows shells.
F# is a convergence of OO and Functional, the F# runtime library and the .NET runtime library, type inference and generics. So there are a bunch of ways to do anything, which is probably not a good thing. I definitely don't feel facile with making implementation choices in F#.
The upshot is that I appreciate now just how much I am an expert in C++, in that I know the various styles and their tradeoffs, and can make a series of choices that fit together holistically.
I'm using F# as my scripting language in my day job. It's annoying to wait a second for the runtime to load everytime I run a script, but it's worth it because I like F# way better than perl.