Как лучше ловить пропавших без вести !, делай !, возвращайся и возвращайся!в вычислительных выражениях в F # - PullRequest
2 голосов
/ 07 декабря 2010

Мне нравятся выражения для вычислений, но я допускаю простые ошибки, например, забыл ключевое слово return или символ!на выражения, как пусть!и верни !, или я просто забуду написать "сделай!"Это часто случается с монадами состояний, где я склонен забывать о состоянии и просто сосредотачиваться на определенных мной монадических операторах.

Иногда я проверяю, чтобы мои монадические операторы возвращали тип «типа монады» вместо«анонимная» функция.Это помогает отследить мою забывчивость при наборе текста, но не совсем идеально.У кого-нибудь есть лучшие трюки?

1 Ответ

3 голосов
/ 07 декабря 2010

Учитывая типичную монаду, ваш код не должен компилироваться, если вы пропускаете ! после ключевого слова, потому что типы не сработают.Например:

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
}
...