我遇到了讓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