如何最好地抓住错过让!,做!,返回并返回!在F#中的计算表达式中

时间:2010-12-07 16:39:08

标签: f# computation-expression

我喜欢计算表达式,但我犯了简单的错误,比如忘记了return关键字或者!像表达式一样!并返回!或者我只是忘记写了!这种情况发生在状态monad中,我倾向于忘记状态,只关注我定义的monadic运算符。

我有时会确保我的monadic运算符返回一个“monad类型”的类型而不是“匿名”函数。这有助于跟踪我的健忘打字,但并不是很理想。有人有更好的技巧吗?

1 个答案:

答案 0 :(得分:3)

给定一个典型的monad,如果你在关键字后面缺少!,你的代码就不应该编译,因为这些类型不会有效。例如:

let sum = async {
  let x = async { return 1 }
  let y = async { return 2 }
  return x + y
}

这不会编译,因为您尝试添加两个Async<int>,但如果您将let更改为let!,则会进行编译。

同样,要识别缺失的return,只需注意编译器警告消息和奇怪的monadic类型:

let sum = async {
  let! x = async { return 1 }
  let! y = async { return 2 }
  x + y // warning FS0020
}

在这种情况下,sumAsync<unit>,当您尝试在代码中的其他位置使用它时,这应该很明显。或者,您可以使用类型注释立即捕获此问题:

let sum : Async<int> = async { // error FS0001: type mismatch
  let! x = async { return 1 }
  let! y = async { return 2 }
  x + y // warning FS0020
}