比方說,我有一個功能,它做了一些相當複雜的事情,它是在子功能的幫助下實現的。爲了讓事情變得更容易,我想使用一些私有的函數實現的中間結構,而不是元組。是否有可能在F#中的函數範圍聲明一個類型?
我不希望這些結構的聲明泄漏到外面。所以我想這樣的事情:
let someComplexFun p =
type SomeRecord = {i:int; x:int; y:int;}
type SomeOtherRecord = {...}
let innerFunctionA (x:SomeRecord) = ...
let innerFunctionB (x:SomeOtherRecord) = ...
...
我試過了,但當然編譯器不讓我這樣做。我查看了文檔,並且我無法很快看到這些類型必須在模塊級別聲明。
在LISP例如,似乎這一切都完全合法,例如:
(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))))
所以,我失去的東西嗎?這是否可能,如果F#呢?
也許函數是一流的,但類不是;)...不,它真的很奇怪 - 爲什麼不把這樣的東西編譯成匿名類?但是Komrade P.寫的解決方案很簡單。我認爲如果你的函數太長以至於你需要給內層類型,那麼也許你應該考慮一些重構 – Carsten