-
Notifications
You must be signed in to change notification settings - Fork 4
OCaml to F# conversions
OCaml is written using a syntax which is closer to F# verbose syntax while current main stream F# is typically written using F# lightweight syntax.
OCaml has a different typing system than F# so where some code formatting that works for OCaml will not work for F#. Quite often the only changes needed are in whitespace. e.g. tabs, newlines. At other times, one will need to add |> ignore to keep F# happy, enclose operators in parenthesizes , or change the characters for an operator.
OCaml and F# verbose syntax can handle lines like
let newcps = filter
(fun (l,(p,q)) ->
but F# light syntax wants
let newcps = filter (fun (l,(p,q)) ->
or
let newcps =
filter (fun (l,(p,q)) ->
The use of the Pervasives qualifier is often not needed as most of these functions are now built-in for F#.
The OCaml code here does not rely on a standard set of library functions, yet F# has many built-in functions
based on standard OCaml library functions. As such there are many functions in the lib module that can be directly replaced with built-in F# functions. e.g. F# List module functions.
Within functions OCaml will use "let ... in and ..." while F# Light syntax will require "let ... let ...".
OCaml's Read-Eval-Print Loop is known as toplevel while F#'s is known as F# Interactive
To add custom type printers OCaml has the toplevel install_printer directive while F# interactive has AddPrinter
Where the OCaml module system uses include we will use F# open.
The OCaml code uses some F# keywords which can not be used as identifiers. To use an F# keyword as an identifier enclose the keyword within double backtick marks. See: F# 3.0 Language Reference - 3.4 Identifiers and Keywords
OCaml can define the same function more than once in a module while F# will not allow this. To overcome this just rename the first function and change uses of it until reaching the next definition. In class.fs this was done for TAUT.
OCaml has the Format module; for F# we will use Jack's FSharp.Compatibility.OCaml.Format .
OCaml has the Num module; for F# we will use Jack's FSharp.Compatibility.OCaml/Num .
F# uses operator overloading while OCaml uses unique character sequences for many math operators.
Type OCaml F# comment
Int + + addition
Float +. + addition
Num +/ + addition; F# version via FSharp.Compatibility.OCaml/Num
String ^ + concatenation
Int / / division
Float /. / division
Num // / division; F# version via FSharp.Compatibility.OCaml/Num
Syntax conversions for OCaml to F#
OCaml F# Comment
& && Boolean And
or || Boolean Or
(o) << Backward composition operator
land &&& Logical And
lor ||| Logical Or
lxor ^^^ Logical Xor
type ('a,'b)func type func<'a,'b> Explicit generic construct
string_of_int string Conversion to string
10/24/13
See: Languages with Type Inference: OCaml, F#, Scala, Haskell