2013-02-08 23 views
32

Câu hỏi này bắt đầu ra từNếu SML.NET có functors tại sao không thể F #?

  1. dịch của tôi về "ML for the Working Programmer" (WorldCat) bởi L. C. Paulson để F # trong đó sử dụng functors cho các ví dụ.
  2. Mong muốn cuối cùng để dịch "Purely Functional Data Structures" (WorldCat) bởi Chris Okasaki, trong đó sử dụng functors.
  3. Đọc "CATEGORIES TYPES AND STRUCTURES - An Introduction to Category Theory for the working computer scientist" (WorldCat) của Andrea Asperti và Giuseppe Longo.
  4. Không hiểu tất cả, chủ yếu là lý thuyết danh mục.

SML.NET có thể làm functors và làm việc với Microsoft .NET.
* Xem: SML.NET User Guide Phần 4.8.2 Các loại lớp và các hàm?

Tôi tiếp tục thấy rằng F # không thể thực hiện các functors thực sự vì một số hạn chế trong Microsoft .NET.
* Can ML functors be fully encoded in .NET (C#/F#)?
* Any workaround for functor?

Vì vậy, nếu có thể làm SML.NET functors trên NET thì tại sao không thể F #? SML.NET đã làm gì mà F # không thể?

Tôi càng tìm hiểu về các giáo viên đến từ lý thuyết thể loại, tôi càng thấy rõ vẻ đẹp của họ và mong muốn có chúng trong F #.

EDIT

Trong một sự theo đuổi để hiểu rõ hơn về mối quan hệ giữa lý thuyết thể loại và lập trình chức năng nhìn thấy những Q&A tại CS:StackExchange.

+0

Vì mọi người có câu hỏi này nhìn chằm chằm, tôi đang thêm một liên kết đến bài báo này vì họ có thể tìm thấy giấy quan tâm. [Vật lý, Cấu trúc liên kết, Logic và Tính toán: Đá Rosetta] (http://arxiv.org/pdf/0903.0340v3.pdf) –

+0

Quan tâm: [Generics of a Higher Type] (http: //adriaanm.github. io/files/higher.pdf) và [Loại cao hơn trong Scala là gì?] (http://stackoverflow.com/questions/6246719/what-is-a-higher-kinded-type-in-scala) và [Thêm Generics bậc cao hơn vào F # - (Loại lớp)] (https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2228766-add-higher-order-generics-to-f-type- classes-) –

+0

Quan tâm: [Quá tải toán tử toàn cục trong F #] (http://stackoverflow.com/questions/19682432/global-operator-overloading-in-f) và [FsControl - Thư viện cơ sở F # với chuẩn ad-hoc chức năng đa hình trên các kiểu nguyên thủy.] (https://github.com/gmpl/FsControl) –

Trả lời

39

Không có giới hạn cơ bản của .NET để dừng các trình rút gọn được triển khai trong F #. Đúng, chúng không thể được biểu diễn trực tiếp trong siêu dữ liệu .NET, nhưng không thể có các tính năng ngôn ngữ khác của F # như kiểu kết hợp. Trình biên dịch cho các ngôn ngữ có các hàm sĩ (ví dụ: Standard ML, OCaml) có một đường chuyền được gọi là defunctorize; nó hoạt động giống như việc mở rộng mẫu C++, trong đó nó "làm phẳng" các functors bằng cách chuyên chúng thành các mô-đun bình thường.

Trình biên dịch F # có thể làm điều tương tự, nhưng sau đó bạn phải hỏi: làm thế nào điều này sẽ được tiếp xúc với các ngôn ngữ .NET khác? Vì functors không thể là trực tiếp được mã hóa trong hệ thống kiểu .NET, bạn cần phải tìm ra cách nào đó để biểu diễn chúng; và nếu đại diện đó khó khăn/không thể sử dụng từ C# hoặc VB.NET, thì nó vẫn có ý nghĩa để bao gồm F # functors? Một phần không tầm thường của thành công F # xuất phát từ khả năng dễ dàng interop (theo cả hai hướng) với C# và VB.NET. EDIT: Đừng làm cho tôi sai - Tôi muốn có functors trong F #, họ sẽ thực sự hữu ích để xử lý một vài trường hợp mà hiện nay đang đau đớn và/hoặc không thể thực hiện mà không có chúng. Tôi chỉ chỉ ra rằng lý do chính của ngôn ngữ chưa (và có lẽ sẽ không bao giờ) có functors là vấn đề interop đã không được giải quyết; vấn đề mã hóa siêu dữ liệu thực sự là phần dễ dàng.

EDIT 2: Mã cho defunctorize đường chuyền của MLton: defunctorize.fun

Cập nhật: tôi đã có một suy nghĩ về cách functors thực thể được thể hiện trong hệ thống kiểu NET, vì vậy tôi đặt lại với nhau một thử nghiệm nhỏ. Nó không phải là đẹp, nhưng nó hoạt động - vì vậy bây giờ chúng ta biết nó ít nhất là hợp lý rằng F # một ngày nào đó có thể hỗ trợ các functors. Trong thực tế, sự phức tạp mà bạn thấy trong mã thử nghiệm của tôi sẽ bị ẩn bởi trình biên dịch/ngôn ngữ. Nếu bạn muốn kiểm tra xem nó ra: experimental-functors

+1

+1 - Bạn có thể đánh vào đầu bằng interop. Bất kỳ ý tưởng làm thế nào functors trong SML.NET xuất hiện sang ngôn ngữ khác NET. – Daniel

+0

@Daniel Điều này có hữu ích không? [Cuộc phiêu lưu về khả năng tương tác: Trải nghiệm SML.NET] (http://research.microsoft.com/pubs/67332/p53-benton.pdf) –

+0

@GuyCoder: Cảm ơn, nhưng tôi không thấy gì về cách các functors được trình bày trong CIL ở đó. Dựa trên những gì Jack nói, tôi có nên giả sử một functor là "defunctorized" thành nhiều mô-đun chuẩn và xuất hiện như vậy với các ngôn ngữ .NET khác không? – Daniel

Các vấn đề liên quan