2011-08-25 37 views
7

Hãy nói rằng tôi có một chức năng mà làm một cái gì đó khá phức tạp và nó được thực hiện với sự giúp đỡ của subfunctions. Để làm cho mọi việc trở nên dễ dàng hơn, thay vì tuple, tôi muốn sử dụng một số cấu trúc trung gian riêng để thực hiện chức năng này.Có thể khai báo một loại tại phạm vi chức năng trong F # không?

Tôi không muốn tuyên bố các cấu trúc này bị rò rỉ bên ngoài. Vì vậy, tôi muốn một cái gì đó như thế này:

let someComplexFun p = 
    type SomeRecord  = {i:int; x:int; y:int;} 
    type SomeOtherRecord = {...} 

    let innerFunctionA (x:SomeRecord) = ... 
    let innerFunctionB (x:SomeOtherRecord) = ... 

    ... 

Tôi đã thử nó nhưng tất nhiên trình biên dịch không cho phép tôi làm điều này. Tôi nhìn vào tài liệu và tôi không thể nhìn thấy bất cứ nơi nào một cách nhanh chóng mà các loại phải được khai báo ở cấp mô-đun.

Trong LISP ví dụ, có vẻ như đó là tất cả hoàn toàn hợp pháp, ví dụ .:

(defun foo (when) 
    (declare (type (member :now :later) when)) ; Type declaration is illustrative and in this case optional. 
    (ecase when 
     (:now (something)) 
     (:later (something-else)))) 

Vì vậy, tôi thiếu cái gì? Điều này có thể xảy ra nếu F # không?

+0

có thể chức năng là lớp học đầu tiên nhưng lớp học không;) ... không có gì thực sự lạ - tại sao không biên dịch một điều như vậy thành một lớp học cùng tên? Nhưng giải pháp là dễ dàng đủ như Komrade P. đã viết. Tôi nghĩ rằng nếu chức năng của bạn là quá lâu mà bạn cần phải cung cấp cho các loại bên trong thì có lẽ bạn nên suy nghĩ về một số refactoring anyway – Carsten

Trả lời

5

Để xác minh rằng điều này là không được phép theo đặc điểm kỹ thuật, hãy nhìn vào ngữ pháp của F # biểu thức trong đặc điểm kỹ thuật: Section 6: Expressions. Nó liệt kê các cấu trúc khác nhau có thể được sử dụng thay cho expr và không có cấu trúc nào trong số đó là khai báo kiểu type-defn (được mô tả trong Section 8: Type Declarations).

Cú pháp (đơn giản) cho khai báo hàm là let ident args = expr, do đó, nội dung phải là biểu thức (và bạn không thể khai báo các loại bên trong biểu thức).

1

Các loại chỉ có thể được khai báo ở phạm vi mô-đun hoặc không gian tên trong F #.

(Bạn có thể sử dụng bổ truy cập như internal hoặc chữ ký tập tin để ẩn các loại từ các thành phần khác.)

+0

Trường hợp chính xác trong tài liệu nào nó nói như vậy? Tôi không thể tìm thấy nó. Liên kết xin vui lòng? –

+2

Nếu bạn muốn "bằng chứng", bạn có thể xem các đặc tả ngôn ngữ. Ngoài ra, nếu bạn chỉ tạo mô-đun cho các hàm này, tốt hơn là đánh dấu các loại là riêng tư và không phải là nội bộ. Riêng tư có nghĩa là chỉ trong mô-đun cụ thể đó, nội bộ có nghĩa là chỉ trong "dự án" cụ thể đó (hoặc hội đồng). –

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