IMHO the largest difference is purity.
Not being able to mix IO and non-IO functions like this
print “Enter name:”
print (“Hello “ ++ readStdinLine ++ “!”)
in Haskell means you have to learn a new way of writing IO code.Not really. You can mix them in Haskell too. Think of F# as Haskell except you are always working in the IO monad. Haskell doesn't require a "new way of writing IO code" at all. It just allows you to separate out the IO from the pure in a way that can be enforced by the compiler. But there is nothing preventing you from writing all Haskell code in the IO monad if you were so inclined - which is essentially OCaml/F#.
> Not really. You can mix them in Haskell too.
True, but it's not particularly syntactically convenient.
The entire point of monadic (do) syntax in Haskell is to make this convenient. I'm not following you exactly.
runeks mentioned
print “Enter name:”
print (“Hello “ ++ readStdinLine ++ “!”)
which can't be written like that with do notation. It's also pretty confusing code to write in any language, so maybe that's not a problem.True, do notation does require you to add a line -
main = do
print "Enter name:"
name <- getLine
print ("Hello " ++ name ++ "!")
But I only said that it makes this convenient not that it allowed you to write any statement you want. It still makes it easy to intersperse pure and non-pure code.
The largest difference imo between F#/Ocaml and Haskell is the evaluation model where Haskell is lazy by default.