F #: Больше точек возврата в функциях, как с ними работать?

У меня проблема при возврате значений в сложных функциях. Примеры всегда лучше:

Рассмотрим следующую функцию:

let myf (mypar: int) =
   mypar + 1

Хорошо, здесь нет проблем, эта функция скомпилирована правильно, и подпись:

val myf: int -> int

Хорошо, хорошо. Теперь рассмотрим этот код:

let myf (mypar: int) =
   if mypar = 2 then
      4 (* ERROR *)
   mypar + 1

Это не работает:

Это выражение должно было иметь тип unit, но здесь есть int

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

Обратите внимание, что если я вставлю модуль () , все будет работать, например:

let myf (mypar: int) =
   if mypar = 2 then
      () (* No error *)
   mypar + 1

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

Обратите внимание, что если я вставлю модуль () , все будет работать, например:

let myf (mypar: int) =
   if mypar = 2 then
      () (* No error *)
   mypar + 1

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

Обратите внимание, что если я вставлю модуль () , все будет работать, например:

let myf (mypar: int) =
   if mypar = 2 then
      () (* No error *)
   mypar + 1

Но этот модуль не возвращает мою функцию !!! это продолжается !!! Кроме того, не могли бы вы объяснить мне, как F # справляется с этим ???

Thankyou

6
задан Guy Coder 29 February 2016 в 15:12
поделиться