Signature Files and Access Modifers in F#

╄→гoц情女王★ 提交于 2019-12-21 09:23:14

问题


I've recently been trying to learn the Object-Oriented aspects of F#, and have become curious about how to restrict access to types/modules in the language.

More specifically, I want to know the difference between writing this:

Example.fsi

module Stack =
    val foo : string

Example.fs

module Stack =
    let foo = "foo"
    let bar = "bar"

and alternatively this:

module Stack =
    let foo = "foo"
    let private bar = "bar"

Do they not accomplish exactly the same thing in the end? Coming from a C# background, I'm much inclined just to use the access modifiers over signature (FSI) files. They seem to be more versatile (can apply to modules/types in namespaces, for example), whereas I don't any situation in which signature files offer something that access modifiers don't.


回答1:


They accomplish almost the same thing. (Note that you can use an .fsi file for types in namespaces too, was unsure what your comment about that meant.)

A signature file has a couple advantages:

  • You can make entities public for the duration of the file, but then private to the subsequent files of the project.
  • You can have just your short summary in the signature file, so the public interface is easy to read without having to scan tons of code.

The first bullet is not to be trifled with - within-assembly encapsulation like this is actually a pretty huge feature for very large projects. Being able to define a few types which are public to one another within File1.fs, but then only have a subset of those types/methods be public to the rest (File2.fs, File3.fs, etc.) is quite useful (a little bit like 'friend' in C++).



来源:https://stackoverflow.com/questions/1526902/signature-files-and-access-modifers-in-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!