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?
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