2012-09-30 43 views
1

在以下ML提取(取自Effective ML talk)中,值綁定表達式中有一個模塊縮寫。是否有可能在F#中做同樣的事情? 我知道你可以做模塊縮寫,我特別感興趣,如果你可以這樣做「內聯」。是否可以在函數或值綁定中使用F#模塊縮寫?

let command = 
    let default_config = { exit_code = 0; message = None } in 
    let flags = 
    let module F = Command.Flag in 
    [ F.int "-r" (fun cfg v -> { cfg with exit_code = v }); 
     F.string "-m" (fun cfg v -> { cfg with message = v }); 
    ] 
    ... 

回答

1

不,此功能在F#中不可用。你只能做頂層模塊的縮寫(如你所說)使用:

module F = Command.Flag 

您可以在源文件中寫的這些,但他們必須要在頂級水平,其範圍是永遠直到文件結束(或直到隱藏F的另一個定義)。也許如果你使用這個,然後有另一個定義隱藏F,它會有類似的效果。例如:

module L = List 
[0 .. 9] |> L.map ((*) 2) // Uses functional `List.map` 

module L = Seq  
[0 .. 9] |> L.map ((*) 2) // Uses lazy `Seq.map` 

我同意taht這將是在許多情況下,一個有用的功能 - 在另一方面,F#的編程風格是ML十分不同,因此從有效的ML談話的建議可能不會直接映射到F#編程。如果你需要需要來做一個本地定義,那麼最好的選擇是將它定義爲一個F#對象。

+0

感謝您快速回答Tomas!談話的建議是「打開幾個模塊」([本博客文章中的代碼](https://ocaml.janestreet.com/?q=node/85)),所以本地縮寫只是使模塊處於使用狀態本地明顯和簡潔。我想這個功能會是一個小增加,但是像你說的我們已經足夠了。 – bentayloruk

+0

我看到這將如何是有用的 - 特別是如果你也可以對.NET命名空間進行相同的操作。有時候我只是在文件頂部有各種各樣的「開放式」聲明,而且我不知道是否需要它們。更好的工具也可以幫助解決這個問題(即自動刪除不必要的「open」聲明)。 –

+0

是的,自動刪除未使用的'open'聲明將會很有用。這是我爲F#ReSharper插件建議的功能之一。不過,談話中的建議對我來說很有意義。如果仔細考慮打開哪些模塊以及在代碼中使用全名引用哪些模塊,可以增強代碼*可讀性*。 – bentayloruk

相關問題