设计 – 应该将F#函数放在模块,类或其他结构中吗?

我开始在F#中编写代码,并从函数中调用函数作为参数 – 有很多在线学习资源。现在我试图把这些东西放在一起,而不仅仅是一个功能的集合。不幸的是,我没有找到许多资源来处理结构,设计,甚至是将“位”绑在一起。

我找到了命名空间关键字(例如命名空间MyOnlyNamespace),但是我在命名空间中放置的函数发现编译器错误:

Namespaces cannot contain values. Consider using a module to hold your value declarations.

当我添加模块CoolFunctions我得到

Unexpected start of structured construct in definition. Expected ‘=’ or other token

所以我有一个多部分的问题(但请回答你可以的任何部分)

>什么是模块?
>它是像一个类(类似VB.NET模块)还是其他的东西?
>如果还有别的话,F#中有类吗?
>还有其他结构我应该用吗?
>如何声明模块?

给出一些关于在命名空间之间选择的具体建议,F#中的模块abd类:

>如果您正在使用预期从F#使用的函数编写函数,那么将它们放在模块中是最佳选择。这给你的API类似于List.map和其他基本的F#函数。

关于命名,你应该使用camelCase,除非你希望C#用户也可以调用这些函数。在这种情况下,您应该使用PascalCase(并注意该模块将被编译为一个静态类)。
>如果你正在写类型的delcarations,那么这些应该放在一个命名空间。它们也允许在模块内部,但是它们将被编译为嵌套类。
>如果你正在写F#类,那么它们也应该放在命名空间中。总而言之,如果您正在编写将由C#调用的F#代码,那么使用类是最好的机制,您可以完全控制用户将看到的内容(F#类被编译为仅一个类)。

如果你有一个文件,它可以从名称空间Foo.Bar或Foo.Bar模块开始,它将文件中的所有代码放在命名空间或模块中。您可以随时在此顶级声明中嵌套更多模块。一个常见的模式是从单个命名空间开始,然后在文件中包含一些类型和模块声明:

namespace MyLibrary

type SomeType = 
  // ...

module SomeFuncs = 
  let operation (st:SomeType) = // ...
http://stackoverflow.com/questions/7550638/should-f-functions-be-placed-in-modules-classes-or-another-structure

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:设计 – 应该将F#函数放在模块,类或其他结构中吗?