design - python调用其他文件的类 - python跨文件夹调用




F#函数应该放在模块,类还是其他结构中? (2)

我开始用F#编写代码,并从函数作为参数调用函数 - 在线有大量的学习资源。 现在我试图将这些部分组合成一个不仅仅是一组函数的东西。 不幸的是,我找不到很多涉及结构,设计或甚至“位”如何联系在一起的资源。

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

命名空间不能包含值。 考虑使用模块来保存您的值声明。

当我添加module CoolFunctions我得到了

定义中结构化构造的意外启动。 预期'='或其他令牌

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

  • 什么是模块?
  • 它是一个类(类似于VB.NET模块)还是完全不同的东西?
  • 如果还有别的,那么F#中是否有类?
  • 我应该使用其他结构吗?
  • 我如何申报模块?

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

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

    关于命名,你应该使用camelCase除非你期望C#用户也调用这些函数。 在这种情况下,您应该使用PascalCase (并注意该模块将被编译为静态类)。

  • 如果您正在编写类型的delcarations,那么这些通常应放在命名空间中。 它们也被允许在模块内部,但随后它们将被编译为嵌套类。

  • 如果您正在编写F#类,那么它们也应该放在名称空间中。 通常,如果您正在编写将由C#调用的F#代码,那么使用类是最好的机制,因为您可以完全控制用户将看到的内容(F#类被编译为一个类)。

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

namespace MyLibrary

type SomeType = 
  // ...

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

什么是模块:

模块被编译为静态类。 但我认为模块类似于C#中的命名空间

F#中有类 - 使用

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

如果你有

namespace Name
module Mod
....

这不会编译 - 如您所知,您可以使用一些替代方案

module Namespace.Module

作为文件中的第一行

要么

namespace Name
module Mod =
    .... 






functional-programming