Tôi đã sử dụng các thư viện Scrap Your Boilerplate và Uniplate trong ngôn ngữ lập trình Haskell và tôi sẽ thấy rằng hình thức lập trình chung trên các công đoàn phân biệt sẽ thực sự hữu ích. Có một thư viện tương đương trong ngôn ngữ lập trình f # không?Phế liệu Boilerplate của bạn trong f #
11
A
Trả lời
11
Tôi không biết; mà không có hỗ trợ được xây dựng trong ngôn ngữ/trình biên dịch, tôi hy vọng sự thay thế duy nhất là một phiên bản dựa trên sự phản chiếu. (Tôi không biết làm thế nào Uniplate được thực hiện - phải không?)
Đây là mã cho một phiên bản dựa trên phản chiếu dựa trên ví dụ từ bản trình bày gốc. Tôi đã không suy nghĩ sâu sắc về những hạn chế của nó, nhưng điều này đơn giản hơn nhiều so với những gì tôi đoán được.
type Company = C of Dept list
and Dept = D of Name * Manager * SubUnit list
and SubUnit = | PU of Employee | DU of Dept
and Employee = E of Person * Salary
and Person = P of Name * Address
and Salary = S of float
and Manager = Employee
and Name = string
and Address = string
let data = C [D("Research",E(P("Fred","123 Rose"),S 10.0),
[PU(E(P("Bill","15 Oak"),S 5.0))])]
printfn "%A" data
open Microsoft.FSharp.Reflection
let everywhere<'a,'b>(f:'a->'a, src:'b) = // '
let ft = typeof<'a> // '
let rec traverse (o:obj) =
let ot = o.GetType()
if ft = ot then
f (o :?> 'a) |> box // '
elif FSharpType.IsUnion(ot) then
let info,vals = FSharpValue.GetUnionFields(o, ot)
FSharpValue.MakeUnion(info, vals |> Array.map traverse)
else
o
traverse src :?> 'b // '
let incS (S x) = S(x+1.0)
let newData = everywhere(incS, data)
printfn "%A" newData
Các everywhere
chức năng đi qua toàn bộ cấu trúc của một DU độc đoán và áp dụng chức năng f
cho mỗi nút đó là loại mà f
hoạt động trên, để lại tất cả các nút khác như nó vốn có.
Các vấn đề liên quan
- 1. Phế liệu Boilerplate của bạn tương đương với Scala?
- 2. Phế liệu của Haskell Boilerplate (SYB) của bạn - chỉ áp dụng chuyển đổi một lần thay vì ở mọi nơi
- 3. Existentials và Scrap Boilerplate của bạn
- 4. lỗi cổng trong phế liệu
- 5. tài liệu gae-boilerplate
- 6. Phế liệu HtmlXPathSelector
- 7. Phế liệu, tháo dỡ dữ liệu bên trong Javascript
- 8. Phế liệu - Theo các liên kết RSS
- 9. Tạo một con nhện phế liệu chung
- 10. Xuất khẩu tùy chỉnh phế liệu
- 11. Phế liệu với một mảng lồng nhau
- 12. Chạy các tác vụ Phế liệu trong Python
- 13. HTML5 Boilerplate và Twitter Bootstrap
- 14. Phế liệu: cách tắt hoặc thay đổi nhật ký?
- 15. Không thể lấy đường ống Phế liệu để làm việc
- 16. Phế liệu dường như không hoạt động trên DFO
- 17. Backbone Boilerplate Template
- 18. Chạy Phế liệu từ tập lệnh - Treo số
- 19. Backbone.Marionette vs Backbone-Boilerplate
- 20. Lệnh quản lý tùy chỉnh Django chạy Phế liệu: Cách đưa các tùy chọn của Scrapy?
- 21. CodeIgniter + HTML5 Boilerplate + Twitter Bootstrap
- 22. Bạn đang sử dụng mã f # nào?
- 23. Haskell ReaderT Env IO boilerplate
- 24. Bạn có thể xác định toán tử (***) trong F # không?
- 25. Phế liệu: Đề xuất cho nhiều lần trả lại/mục vào cơ sở dữ liệu
- 26. Phế liệu: Theo liên kết để nhận dữ liệu Mặt hàng bổ sung?
- 27. Bạn có thể xác định toán tử của riêng mình trong F # không?
- 28. HTML5 Boilerplate .htaccess cache busting không hoạt động với WordPress
- 29. Bộ sưu tập dữ liệu song song trong F #
- 30. Biểu mẫu Phế liệuYêu cầu gửi JSON
Đây là một gợi ý tốt, tôi sẽ phải suy nghĩ về những tác động hiệu quả của cách tiếp cận như vậy. Nó có lẽ không quan trọng cho usecase cụ thể của tôi anyway. –
re: câu hỏi của bạn về cách Uniplate được triển khai, nguồn có sẵn tại http://community.haskell.org/~ndm/darcs/uniplate/. –
Tôi đã chấp nhận câu trả lời của bạn vì tôi nghĩ đó là cách tiếp cận tốt - nhưng tôi thực hiện thay đổi để hoạt động chính xác: Tôi đã thay thế 'ft = ot' bằng 'ot.IsSubclassOf (ft)' - ngược lại không khớp khi kiểu đối số của f, tức là 'a là tổng quát hơn so với đối số cụ thể được chuyển. –