Различение перегруженных функций f# с дополнительными параметрами

F# позволяет перегруженным функциям отличаться только дополнительным параметром, например:

type MyClass() = 
    member this.func(a: string, b:string) = "func(a,b)"
    member this.func(a: string, ?b:string) = "func(a,?b)"

Как бы вы назвали первую функцию?

1 ответов


Я не думаю, что есть разумный способ вызвать первую функцию, если две перегруженные функции отличаются только необязательным параметром. Как упоминалось в комментариях, использование этого, вероятно, плохой дизайн, и вы должны переименовать параметры.

как вы, вероятно, заметили, при попытке вызова функции обычным способом с помощью MyClass().func("A","B"), вы получаете сообщение об ошибке, жалуясь на двусмысленность:

ошибка FS0041: уникальная перегрузка для метода "func" не удалось определить на основе информации о типе до этой точки программы. Может потребоваться аннотация типа. Кандидаты: - члены класса MyClass.func: a: строка * ?b: string - > строка, член MyClass.func: a: string * b: string - > string

вы можете вызвать вторую перегрузку явно двумя способами (С или без ?b) благодаря тому, что вы можете явно предоставить Some значение необязательного аргумента:

MyClass().func("A")
MyClass().func("A",?b=Some "B")

из любопытства, оказывается, что первую перегрузку можно вызвать с помощью статического ограничения-члена. Это довольно уродливо, и вы, вероятно, не должны этого делать, но он вызывает первую перегрузку:

let inline callFunc (o:^T) a b = 
  (^T : (member func : string * string -> string) (o, a, b)) 

callFunc (MyClass()) "A" "B"