F # đang cho tôi một số rắc rối với các quy tắc suy luận kiểu của nó. Tôi đang viết một trình xây dựng tính toán đơn giản nhưng không thể có được các ràng buộc biến kiểu chung của tôi ngay.Làm cách nào để dịch một ràng buộc tham số kiểu `chung T: U` từ C# thành F #?
Mã mà tôi muốn trông như sau trong C#:
class FinallyBuilder<TZ>
{
readonly Action<TZ> finallyAction;
public FinallyBuilder(Action<TZ> finallyAction)
{
this.finallyAction = finallyAction;
}
public TB Bind<TA, TB>(TA x, Func<TA, TB> cont) where TA : TZ
{ // ^^^^^^^^^^^^^
try // this is what gives me a headache
{ // in the F# version
return cont(x);
}
finally
{
finallyAction(x);
}
}
}
tốt nhất (nhưng không biên dịch mã) Tôi đã đưa ra cho F # phiên bản cho đến thời điểm này là:
type FinallyBuilder<′z> (finallyAction : ′z -> unit) =
member this.Bind (x : ′a) (cont : ′a -> ′b) =
try cont x
finally finallyAction (x :> ′z) // cast illegal due to missing constraint
// Note: ' changed to ′ to avoid bad syntax highlighting here on SO.
Unfortu nately, tôi không có đầu mối làm thế nào tôi sẽ dịch các ràng buộc loại where TA : TZ
loại phương pháp Bind
. Tôi nghĩ rằng nó phải là một cái gì đó như ′a when ′a :> ′z
, nhưng trình biên dịch F # không thích điều này bất cứ nơi nào và tôi luôn luôn kết thúc với một số loại biến chung chung hạn chế khác.
Có thể ai đó vui lòng cho tôi xem mã F # chính xác không?
Bối cảnh: Mục tiêu của tôi là để có thể viết một F workflow # tùy chỉnh như thế này:
let cleanup = new FinallyBuilder (fun x -> ...)
cleanup {
let! x = ... // x and y will be passed to the above lambda function at
let! y = ... // the end of this block; x and y can have different types!
}
OK, tôi khá thuyết phục khi không có giải pháp gọn gàng cho những gì tôi muốn làm. Việc chỉ định 'obj' cho' finallyAction' có tác dụng phụ khó chịu khi giảm tất cả các giá trị ràng buộc tùy chỉnh ('let!') Trong luồng công việc tùy chỉnh thành 'obj', có nghĩa là tôi không thể thực hiện công việc hợp lý với chúng bất kỳ lâu hơn. Sẽ cần phải suy nghĩ một số chi tiết về cách triển khai trình tạo đó khác nhau. Nhưng tôi hy vọng họ sẽ sửa lỗi này trong phiên bản tương lai của ngôn ngữ F # ... – stakx
@stakx: Ngay cả khi bạn sử dụng 'obj', loại giá trị được ràng buộc bằng cách sử dụng' let! 'Phải là loại thực tế (cụ thể hơn) . Tôi đã chỉnh sửa câu trả lời để bao gồm một ví dụ minh họa điều này (cuối cùng tôi đã thử nghiệm nó :-)). –
bạn là một thuật sĩ! :) Tôi đoán tất cả những chú thích kiểu này đã bị cản trở. Cảm ơn! – stakx