2013-02-26 27 views
23

Cho rằng việc triển khai generics CLR hỗ trợ nhiều tính năng hơn so với JVM, chẳng hạn như reification, và các generic của JVM chỉ là một Java "compiler trick", tại sao các loại cao hơn không thể có trong F # nhưng có thể trong Scala? Việc thực hiện Generative CLR bằng cách nào đó có được trong cách của sự vật, trong khi thiếu JVM của một cho phép bạn đi xa hơn những gì các nhà thiết kế dự định; hơi giống như ngôn ngữ động cho phép bạn thực hiện các thủ thuật mà một trình biên dịch mạnh mẽ đánh máy sẽ làm cho không thể?Loại có mức độ cao hơn — tại sao có thể là Scala nhưng không phải F #?

+10

Tại sao điều này bị đóng? Tôi thực sự không hiểu lời giải thích được đưa ra. Tôi đang cung cấp sự kiện, đặt câu hỏi có câu trả lời thực tế. Một người nào đó dường như bám vào từ "tốt hơn" như câu hỏi ban đầu đã được tuyên bố, và tạo ra một câu trả lời tranh luận, nhưng đó không phải là câu hỏi. Mọi người chỉ cần tìm các từ khóa như "tốt hơn" và bỏ phiếu để đóng một ưu tiên? – lobsterism

Trả lời

20

Về nguyên tắc, tôi không chắc chắn rằng có bất kỳ điều gì ngăn cản F # bao gồm các loại được đánh giá cao hơn; CLR không hỗ trợ chúng một cách tự nhiên, vì vậy một chiến lược biên dịch gián tiếp sẽ cần phải được sử dụng, nhưng đó cũng là trường hợp của Scala trên JVM. Nó có thể hoặc có thể không phức tạp hơn để làm điều này trên đầu trang của các đại tướng thống nhất của CLR, nhưng tôi nghi ngờ lý do mà F # không bao gồm chúng là triết học hơn. Mặc dù các loại có chất lượng cao hơn sẽ tốt hơn, nhưng thiết kế của F # có xu hướng ưu tiên các tính năng đơn giản tương thích tốt với các ngôn ngữ .NET khác; các loại có số lượng cao hơn có thể cần nỗ lực đáng kể để thêm vào ngôn ngữ, sẽ làm phức tạp suy luận kiểu và các phần khác của ngôn ngữ và chắc chắn sẽ không tương tác tốt với C# và các ngôn ngữ .NET khác, vì vậy chi phí (bao gồm chi phí cơ hội) lớn hơn những lợi ích.

+0

Các loại có mức độ cao hơn được định nghĩa trong Scala không tương thích với Java? – lobsterism

+1

@lobsterism - Tôi không phải là chuyên gia về Scala, nhưng vì hệ thống kiểu Java không hỗ trợ chúng, tôi không chắc họ có thể làm như thế nào. – kvb

-4

Tốt hơn? Conceivably.

Sự khác biệt duy nhất tôi biết là một tính năng của generics được gọi là "chuyên môn hóa". Và nó có sẵn dưới sự kiểm soát lập trình viên trong Scala. Vì vậy ... tôi phải nói rằng người ta có thể làm cho trường hợp Scala là "tốt hơn".

+0

Scala * là * tốt hơn, đó là những gì tôi đang nói, nhưng tự hỏi tại sao nó không thể như vậy trong F # khi CLR có hệ thống kiểu mạnh hơn so với JVM. – lobsterism

+0

@lobsterism Java và JVM không giống nhau ... Đó là cách scala có thể có hệ thống gõ "mạnh hơn" so với java nhưng cả hai đều sử dụng cùng một JVM! – korefn

+1

Trên thực tế, "chuyên môn hóa" của Scala cho thấy một sự xuất hiện ngắn của JVM: các kiểu nguyên thủy nằm ngoài hệ thống phân cấp đối tượng và các kiểu generic không được sửa đổi. Mặt khác, .NET và F # có 'ValueTypes' là một phần của phân cấp đối tượng trong khi có tất cả các lợi ích hiệu suất của các kiểu nguyên thủy của JVM. Có nghĩa là một kiểu như 'List ' in .NET (trong đó 'Int32' là một .NET' ValueType') được hoàn toàn hợp nhất và không yêu cầu boxing/unboxing để truy cập các phần tử. –