F#中的签名文件和访问修改器

Nol*_*rin 8 f# access-modifiers signature-files

我最近一直在努力学习F#的面向对象方面,并且对如何限制对该语言中的类型/模块的访问感到好奇.

更具体地说,我想知道写这个之间的区别:

Example.fsi

module Stack =
    val foo : string
Run Code Online (Sandbox Code Playgroud)

Example.fs

module Stack =
    let foo = "foo"
    let bar = "bar"
Run Code Online (Sandbox Code Playgroud)

或者这个:

module Stack =
    let foo = "foo"
    let private bar = "bar"
Run Code Online (Sandbox Code Playgroud)

他们到底完全没有做同样的事情吗?来自C#背景,我更倾向于使用访问修饰符而不是签名(FSI)文件.它们似乎更通用(例如,可以应用于命名空间中的模块/类型),而我不会在任何情况下签名文件提供访问修饰符所不具备的内容.

Bri*_*ian 11

他们完成了几乎相同的事情.(请注意,您也可以将.fsi文件用于名称空间中的类型,不确定您对此的评论意味着什么.)

签名文件有几个优点:

  • 您可以public在文件的持续时间内创建实体,然后创建private项目的后续文件.
  • 您可以在签名文件中获得简短的摘要,因此无需扫描大量代码即可轻松阅读公共界面.

第一个要点不容小觑 - 像这样的组件内封装对于非常大的项目来说实际上是一个非常大的功能.能够在File1.fs中定义一些彼此公开的类型,但是只有那些类型/方法的子集公开给其余的(File2.fs,File3.fs等)是非常有用的(有点像C++中的'朋友').