The F# compiler appears to perform type inference in a (fairly) strict top-to-bottom, left-to-right fashion. This means you must do things like put all definitions before their use, order of file compilation is significant, and you tend to need to rearrange stuff (via |>
or what have you) to avoid having explicit type annotations.
How hard is it to make this more flexible, and is that planned for a future version of F#? Obviously it can be done, since Haskell (for example) has no such limitations with equally powerful inference. Is there anything inherently different about the design or ideology of F# that is causing this?
F=MA is describing a force, while P=MV is actually momentum. The first equation states that a Force is equal to Mass times Acceleration, or Newton's second law of motion. The second one states that Momentum (P) is equal to Mass times Velocity. Objects that have momentum are not necessarily being acted on by a force.
F = force m = mass a = acceleration Newton's Second Law.
If you can measure the mass of your object and how it's accelerating, you can use F = ma to determine the net force acting on the object. If you can measure the mass of your object and you know (or can measure) the net force being applied to it, you can determine how that object will accelerate.
Is there anything inherently different about the design or ideology of F# that is causing this?
Yes. F# uses nominal rather than structural typing because it is simpler and, therefore, easier for mere mortals to use.
Consider this F# example:
let lengths (xss: _ [] []) = Array.map (fun xs -> xs.Length) xss let lengths (xss: _ [] []) = xss |> Array.map (fun xs -> xs.Length)
The former does not compile because the type of xs
inside the anonymous function cannot be inferred because F# cannot express the type "some class with a Length
member".
In contrast, OCaml can express the direct equivalent:
let lengths xss = Array.map (fun xs -> xs#length) xss
because OCaml can express that type (it is written <length: 'a ..>
). Note that this requires more powerful type inference than either F# or Haskell currently have, e.g. OCaml can infer sum types.
However, this feature is known to be a usability issue. For example, if you screw up elsewhere in the code then the compiler has not yet inferred that the type of xs
was supposed to be an array so any error message it can give can only provide information like "some type with a Length member" and not "an array". With only slightly more complicated code, this quickly gets out of control as you have massive types with many structurally inferred members that don't quite unify, leading to incomprehensible (C++/STL-like) error messages.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With