Tôi đang gặp sự cố khi DU của tôi hoạt động như mong đợi. Tôi đã xác định một DU mới mà một trong hai có một kết quả của loại < 'a> hoặc bất kỳ ngoại lệ bắt nguồn từ System.ExceptionF # Loại hình Công đoàn Phân biệt đối xử
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"))
Tôi không thể hiểu tại sao nó lại được cho phép tôi để tạo ra một 'Lỗi' nếu Tôi làm điều đó trong 2 bước, nhưng khi tôi đang làm điều tương tự trên một dòng, tôi nhận được một lỗi Value Restriction.
Tôi đang thiếu gì?
Cảm ơn
CẬP NHẬT
Nhìn vào bài bởi @kvb, thêm loại thông tin mỗi khi tôi cần phải tạo ra một lỗi có vẻ hơi dài dòng, vì vậy tôi quấn nó lên thành một phương pháp bổ sung mà tạo Lỗi và hơi ngắn gọn hơn.
// 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"))
Tôi không chắc chắn nếu xác định Lỗi có 'đơn vị' sẽ có bất kỳ hậu quả nào mà tôi chưa lường trước được.
TryResult<unit,_> = Error(err)
Cảm ơn. Điều này thật ý nghĩa. Tôi đã cập nhật câu hỏi của mình bằng cách thêm phương thức tạo Lỗi bổ sung có vẻ hoạt động tốt và giữ cho nó gọn gàng hơn một chút. Chỉ có câu hỏi là loại giờ đây được chỉ định là TryResult Không chắc chắn rằng loại này sẽ có bất kỳ bên trái nào. –
Moog