2011-08-25 84 views
7

比方說,我有一個功能,它做了一些相當複雜的事情,它是在子功能的幫助下實現的。爲了讓事情變得更容易,我想使用一些私有的函數實現的中間結構,而不是元組。是否有可能在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#呢?

+0

也許函數是一流的,但類不是;)...不,它真的很奇怪 - 爲什麼不把這樣的東西編譯成匿名類?但是Komrade P.寫的解決方案很簡單。我認爲如果你的函數太長以至於你需要給內層類型,那麼也許你應該考慮一些重構 – Carsten

回答

5

一個鏈接,以確認這是不允許的,根據規範,看看說明書中的F#表達式的語法:Section 6: Expressions。它列出了可用於代替expr的各種構建體,它們都不是類型聲明type-defn(在Section 8: Type Declarations中描述)。

函數聲明的(簡化)語法是let ident args = expr,所以主體必須是一個表達式(並且不能在表達式中聲明類型)。

1

只能在F#中的模塊或命名空間範圍內聲明類型。

(您可以使用訪問修飾符像internal或簽名文件來隱藏其他組件類型。)

+0

在文檔中究竟是這麼說的?我找不到它。請鏈接? –

+2

如果你想要「證明」,你可以看看語言規範。另外,如果僅爲這些功能創建模塊,最好將這些類型標記爲私有而不是內部。私人只在特定的模塊中表示,內部意味着只在特定的「項目」(或組件)中。 –

相關問題