我遇到了让DU按预期工作的问题。我已经定义了一个新的杜其或者具有<类型“从System.ExceptionF#歧视联盟类型问题
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"))
衍生>或任何异常的结果,我不明白为什么它让我创造一个‘错误’,如果我分两步做,但是当我在一行上做同样的事情时,我得到一个值限制错误。
我在想什么?
由于
UPDATE
综观发布者@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"))
我不确定指定'单元'的错误是否会产生任何后果,我还没有预料到。
TryResult<unit,_> = Error(err)
谢谢。这是有道理的。我已经更新了我的问题,并添加了一个额外的错误创建方法,它似乎可以正常工作并保持一点整理。唯一的问题是,该类型现在指定为TryResult不知道这是否有任何不利因素。 –
Moog