tôi muốn tạo một kiểu với một định nghĩa một chút như thế này:Mô phỏng một 'Any' gõ F #
type LeftRight<'left, 'right> = {
Left : 'left list
Right : 'right list
}
và một vài chức năng:
let makeLeft xs = { Left = xs; Right = [] }
let makeRight ys = { Left = []; Right = ys }
và tôi muốn cung cấp một 'kết hợp' chức năng: (! rõ ràng)
let combine l r = { Left = l.Left @ r.Left; Right = l.Right @ r.Right }
Khi tôi cố gắng và làm một cái gì đó, tôi nhận được các vấn đề như giá trị của tôi là chung chung:
let aaa = makeLeft [1;2;3]
// Value restriction. The value 'aaa' has been inferred to have generic type
// val aaa : LeftRight<int,'_a>
Nếu tôi kết hợp một bên trái và một quyền, đá kiểu suy luận trong và tất cả mọi thứ của A-OK:
let bbb = makeRight [1.0;2.0;3.0]
let comb = combine aaa bbb // LeftRight<int, float>
nhưng tôi muốn sử dụng một chỉ lefts ngày của riêng mình. Tôi đã cố gắng tạo ra một 'Any' loại:
type Any = Any
và rõ ràng quy định các loại trên makeLeft và makeRight:
let makeLeft xs : LeftRight<_, Any> = { Left = xs; Right = [] }
let makeRight ys : LeftRight<Any, _> = { Left = []; Right = ys }
mà làm cho các định nghĩa giá trị hạnh phúc, nhưng làm cho các kết hợp chức năng buồn:
Tôi cảm thấy như có thể là một cách xung quanh điều này với vô số voodoo với quá tải .Net của các cuộc gọi chức năng, nhưng tôi không thể làm cho nó hoạt động. Có ai đã thử điều này trước khi/có bất kỳ ý tưởng?
Tuyệt vời, tôi không biết bạn có thể đặt các đối số chung về giá trị. Điều này sửa chữa nó mà không cần phải gây rối với các loại 'Bất kỳ' trên khắp nơi! –
Điều đó nói rằng, có vẻ như điều này hơi lạ khi bạn có một ràng buộc kiểu - 'let aaa <'a khi' a: compare> = ...' không thể tổng quát được vì nó sẽ thoát khỏi phạm vi của nó. –
@MattKemp Tôi không thấy có vấn đề gì với việc đó. Bạn đang đặt gì ở phía bên tay phải? – TheInnerLight