In that I was expecting the compiler to either complain that name1 in the external binding should be an option<string> or that name2 in the Greeting module should be wrapped as Some("Rogers").
The entire function f is annotated as (~foo: string=?) => string. This what code outside of the function sees. foo is a string because outside code will call it like f(~foo="bar").
The inline type annotation for foo is option<string> though, because that’s what code inside the function sees.
This is why your two type annotations look different. ExternalHello.make has its entire function’s type signature annotated, while Hello.make only annotates individual arguments inside the function.