What would be the idiomatic F# way to write optional parameters?
I would argue that if you need optional parameters your interface is different hence you need another function.
With that said, if you really want optional parameters you must always define a default value, an you could then use partial application for that.
let f op1 op2 nonOpt = op1 + op2 + nonOpt

let fWithDefaults = f 1 2

Then you can use your fWithDefaults whenever you want the defaults.
For your particular example I would write it like this :
type VisaLengths = 
     | Thirteen
     | Sixteen

let generateVisa (length : VisaLengths option) =
     let length = Option.defaultValue Sixteen length
     match length with
     | Thirteen -&gt; &quot;4000000000001&quot;
     | Sixteen -&gt; &quot;4000000000000001&quot;
      

It would be the most &quot;idiomatic&quot;, even if it can be a litter cumbersome but it does what you want to do.
Agree, you still have to passe None... But at least your intention about a optional value is explicit, which is very valuable for others reading your code.