Có điều gì khác biệt về thiết kế hoặc ý thức hệ của F # đang gây ra điều này không?
Có. F # sử dụng danh nghĩa chứ không phải là gõ cấu trúc vì nó đơn giản hơn và do đó, dễ dàng hơn cho các con người chỉ sử dụng.
Xem xét việc này F # ví dụ:
let lengths (xss: _ [] []) = Array.map (fun xs -> xs.Length) xss
let lengths (xss: _ [] []) = xss |> Array.map (fun xs -> xs.Length)
Các cựu không biên dịch vì loại xs
bên trong hàm ẩn danh không thể được suy ra vì F # không thể diễn tả kiểu "một số lớp học với thành viên Length
".
Ngược lại, OCaml thể diễn tả tương đương trực tiếp:
let lengths xss = Array.map (fun xs -> xs#length) xss
vì OCaml thể diễn tả kiểu đó (nó được viết <length: 'a ..>
). Lưu ý rằng điều này đòi hỏi suy luận kiểu mạnh mẽ hơn F # hoặc Haskell hiện có, ví dụ: OCaml có thể suy ra các loại tổng hợp.
Tuy nhiên, tính năng này được biết là một vấn đề về khả năng sử dụng. Ví dụ, nếu bạn vít lên ở nơi khác trong mã thì trình biên dịch vẫn chưa suy ra rằng loại xs
được cho là một mảng vì vậy bất kỳ thông báo lỗi nào mà nó có thể cung cấp chỉ có thể cung cấp thông tin như "một số loại có độ dài" và không phải là "một mảng". Chỉ với mã hơi phức tạp hơn, điều này nhanh chóng mất kiểm soát khi bạn có các loại lớn với nhiều thành viên suy luận cấu trúc không hoàn toàn thống nhất, dẫn đến các thông báo lỗi không thể hiểu được (C++/STL).
Nguồn
2010-07-02 01:56:28
Tôi thực sự không thích câu hỏi này, nhưng nó đã ghi lại một số câu trả lời tuyệt vời và được chiếu sáng, vì vậy tôi cũng rất thích thú :) – Brian
@J Cooper: "Haskell (ví dụ) không có giới hạn như vậy với suy luận mạnh mẽ". Haskell là hư không gần như có suy luận loại mạnh mẽ khi bạn xem xét các tạp chất hoặc hiệu suất. Ví dụ, chức năng 'tầng' của Haskell thường chạy các đơn đặt hàng có cường độ chậm hơn bất kỳ ngôn ngữ được biên dịch nào khác chính xác vì không thể suy ra loại tĩnh chính xác để nó hoạt động theo thời gian chạy. Ngoài ra, nếu tôi ngừng loại bỏ chú thích loại cấp cao nhất khỏi một hàm 'randIntList', tôi có ở đây thì nó sẽ ngừng biên dịch với lỗi' biến dạng mơ hồ '. –
Tôi thích câu hỏi bởi vì tôi cho rằng hầu như tất cả những người mới bắt đầu học F # đều có hai ý nghĩ: "WOW, F # thật mạnh mẽ!" và "WTF, tại sao F # không thể suy luận ngớ ngẩn này ?!" :) –