2011-09-26 65 views
26

我開始在F#中編寫代碼,並從函數調用函數作爲參數 - 在線有大量的學習資源。現在我正試圖將這些作品放在一些不僅僅是一些功能集合中。不幸的是,我沒有發現許多處理結構,設計,甚至是'比特'如何結合在一起的資源。應該將F#函數放在模塊,類或其他結構中嗎?

我發現namespace關鍵字(例如namespace MyOnlyNamespace),但我得到的,我已經放在命名空間中的功能的編譯器錯誤:

命名空間不能包含的值。考慮使用模塊來保存您的值聲明。

當我添加module CoolFunctions我得到

在定義構造結構的意外啓動。預計「=」或其他標記

所以我有一個多部分的問題(但請你回答,你可以在任何部分)

  • 什麼是模塊?
  • 它就像一個類(就像一個VB.NET模塊)還是其他東西?
  • 如果還有別的,那麼F#中有沒有類?
  • 是否還有其他結構可以代替我使用?
  • 如何聲明模塊?

回答

32

提供有關命名空間之間進行選擇的一些具體建議,模塊ABD類在F#:

  • 如果你正在編寫使用let被預期從F#使用的功能,然後把他們一個模塊內是最好的選擇。這給你的API類似於List.map和其他基本的F#函數。

    關於命名,您應該使用camelCase,除非您希望C#用戶也可以調用函數。在這種情況下,你應該使用PascalCase(並且注意模塊將被編譯爲一個靜態類)。

  • 如果你正在寫類型定義,那麼它們通常應該放在一個名字空間中。它們也可以在模塊內部使用,但是它們會被編譯爲嵌套類。

  • 如果您正在編寫F#類,那麼它們也應該放置在命名空間中。總的來說,如果你正在編寫將由C#調用的F#代碼,那麼當你完全控制用戶將看到的內容(F#類僅被編譯爲一個類)時,使用類是最好的機制。

如果你有一個文件,它可以與namespace Foo.Barmodule Foo.Bar,這使所有的代碼文件中的命名空間或模塊內啓動。您始終可以在此頂層聲明中嵌套更多模塊。一個常見的模式是開始具有單個namespace然後在文件中包含一些類型和模塊聲明:

namespace MyLibrary 

type SomeType = 
    // ... 

module SomeFuncs = 
    let operation (st:SomeType) = // ... 
+2

感謝您的回答。請注意,[F#組件設計指南](http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/fsharp-component-design-guidelines.pdf)建議使用標準。 NET命名約定 - 即類型,方法和命名空間的PascalCase,以及參數和局部變量的camelCase。 –

+1

@KirkBroadhurst - 是的,推薦的類型/成員的命名非常清晰。 「let」限定值的情況並不明顯。 F#組件指南建議使用_camelCase ...或... PascalCase_以及註釋_let-bound值在遵循傳統功能設計模式時通常是公開的 。但是,通常在使用PascalCase時,可以使用其他標識符作爲其他語言._ –

+2

作爲面向公共C#/ VB.Net的公用C#/ VB.Net值的替代方法,可以將camelCase與[];) –

4

什麼是模塊:

一個模塊被編譯成一個靜態類。但我認爲,模塊在C#是類似的命名空間

有在F#類 - 使用

type SomeType(constructor,args) = 
     .... 

如果你有

namespace Name 
module Mod 
.... 

這不會編譯 - 如你所知,您可以將文件

在使用一些替代

module Namespace.Module 

爲第一線

namespace Name 
module Mod = 
    .... 
6

關於F#組件的設計有一個非常好的draft online

JPalmer媒體鏈接指向你的syntay問題,但我想一些其他的問題值得更多:

什麼是模塊?

是的JPalmer是正確的 - 模塊被編譯成靜態類,但我們真的很關心F#嗎? 恕我直言,你應該使用F#編程時使用比類更多的模塊。 在OOP中,你可以定義你的類和其中的方法。 在FP中,您可以定義簡單類型(無行爲)和一系列函數來轉換它們。收集這些功能的自然地方就是模塊。

它就像一個類(就像一個VB.NET模塊)或是它是什麼其他的東西?

VB模塊確實是一個很好的比較。

如果還有別的,那麼F#中有類嗎?

是的,你可以使用F#中的類 - 它是一個完整的.net languague,而.net是OOP。你可以做在F#中幾乎一切你可以在VB.net的C#做的(只有在特定情況下,通用的約束可以是一個痛苦)

是否有其他的結構,我應該使用呢? 否 - 將您的函數收集到模塊中,但當然要爲您的數據使用記錄和抽象數據類型。

如何聲明模塊?

看看在線文檔:模塊(F#) - 在那裏你會找到你需要的一切。

相關問題