Учитывая типичную монаду, ваш код не должен компилироваться, если вы пропускаете !
после ключевого слова, потому что типы не сработают.Например:
let sum = async {
let x = async { return 1 }
let y = async { return 2 }
return x + y
}
Это не скомпилируется, потому что вы пытаетесь добавить два Async<int>
s, но скомпилируется, если вы измените let
s на let!
s.
Аналогично, чтобы определить пропущенные return
s, просто обратите внимание на предупреждающие сообщения компилятора и странные монадические типы:
let sum = async {
let! x = async { return 1 }
let! y = async { return 2 }
x + y // warning FS0020
}
В этом случае sum
- это Async<unit>
, чтобыть очевидным, когда вы пытаетесь использовать его в другом месте вашего кода.Кроме того, вы можете использовать аннотацию типа, чтобы сразу решить эту проблему:
let sum : Async<int> = async { // error FS0001: type mismatch
let! x = async { return 1 }
let! y = async { return 2 }
x + y // warning FS0020
}