我遇到了一个问题,无法使我的DU按预期工作。我定义了一个新的DU,其中其结果类型为<'a>或者从System.Exception派生的任何异常。
open System
// New exceptions.
type MyException(msg : string) = inherit Exception(msg)
type MyOtherException(msg : string) = inherit MyException(msg)
// DU to store result or an exception.
type TryResult<'a, 't> =
| Result of 'a
| Error of 't :> Exception
//This is fine.
let result = Result "Test"
// This works, doing it in 2 steps
let ex = new MyOtherException("Some Error")
let result2 = Error ex
// This doesn't work. Gives "Value Restriction" error.
let result3 = Error (new MyOtherException("Some Error"))
我不明白为什么我可以用两步创建一个“错误”,但是当我在同一行上执行相同的操作时,却会出现值限制错误。
我错过了什么吗?
谢谢
更新:
查看@kvb发布的帖子后,每次需要创建一个错误时添加类型信息似乎有点啰嗦,所以我将其封装成了一个额外的方法来创建错误,并且更加简洁。
// New function to return a Result
let asResult res : TryResult<_,Exception> = Result res
// New function to return an Error
let asError (err : Exception) : TryResult<unit,_> = Error(err)
// This works (as before)
let myResult = Result 100
// This also is fine..
let myResult2 = asResult 100
// Using 'asError' now works and doesn't require any explicit type information here.
let myError = asError (new MyException("Some Error"))
我不确定使用“unit”指定错误是否会产生我尚未预见的任何后果。
TryResult<unit,_> = Error(err)