Рассмотрим следующий код:
type Test () =
member o.fn1 (?bo) = 1
member o.fn2 (?bo) = o.fn1 bo
member o.fn3 (?bo) = 1 + bo.Value
member o.fn4 (?bo) = o.fn3 bo
Пока fn1 и fn2 работают нормально, fn4 выдает следующую ошибку:
init.fsx(6,30): ошибка FS0001: ожидается, что это выражение будет иметь тип int, но здесь есть тип 'a option
MSDN:
Необязательные параметры интерпретируются как тип опции F #, поэтому вы можете запросить их обычным образом, чтобы типы опций были запрошены, используя выражение соответствия с Some и None.
Для меня необязательные параметры не интерпретируются как тип опции F #, иначе код будет скомпилирован. Более того, я не понимаю, почему, когда я нависаю над ?bo в fn3, всплывающая подсказка говорит val bo: int option, но извне ожидает только int. Я ожидал бы поведения, не принимающего ничего, int, Some int и None. И как последнее примечание, я не понимаю, почему fn2 работает, но fn4 не делает.
Спасибо за разъяснение