Различение перегруженных функций 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"