作者:鬼厉--七月 | 来源:互联网 | 2023-02-01 17:02
来自文档:
此属性用于指示对模块,记录或联合类型的元素的引用需要显式限定访问权限.
什么是明确的合格访问权限?什么是隐式访问?
1> TheQuickBrow..:
也许一个具体的例子会有所帮助
该List
模块具有此属性.这意味着您不能打开模块:
open List // compile error!
map id [1;2]
相反,你必须这样做:
List.map id [1;2]
2> Eric Olsson..:
来自关于F#页面
将[]
属性添加到模块表示可能未打开模块,并且对模块元素的引用需要显式限定访问.例如,Microsoft.FSharp.Collections.List模块具有此属性.
当模块中的函数和值具有可能与其他模块中的名称冲突的名称并且要求合格访问可以极大地增加库的长期可维护性和可演化性时,这非常有用:可以在不破坏源的情况下将函数添加到模块中兼容性.
3> sgtz..:
F#列表,数组和序列的操作员行为在模块之间手动进行镜像,以便您可以以一致的方式使用这些结构。实现是不同的。
如果您希望以隐式方式工作,则可以轻松进行设置。就像如果您主要使用列表一样,您可以执行以下操作:
let inline map = List.map
etc.
也许将来,可以从上下文中推断模块的类型(即,我们正在使用列表,因此显然map指向List.map)。最终,这是一个语言设计问题。明智的默认设置应该是什么?默认值总是渗入更广泛的代码库中。平均而言,此默认设置对程序员是否有用?因此,RequireQualifiedAccess标志。有人认为这是明智的做法。什么是惯用语?这仍然有意义吗?
您引用的文档并非严格正确。下面是所有隐式的(例如,我不需要使用完全限定的显式DicriminatedUnion.Case1):
type DiscinatedUnion =
| Case1
| Case2
| Case3
let f x =
match x with
| Case1 -> "case1"
| Case2 -> "case2"
| Case3 -> "case3"
f Case1
摘自《 Expert F#》一书
某些功能语言(例如Haskell)允许您通过扩展将类型的隐式传递给类型推断,即类型推断。在撰写本文时,F#不支持此功能,但是F#的设计人员表示,他们希望该语言的将来版本能够支持此功能。无论哪种方式,显式传递操作的字典在所有函数式编程中都是常见的,并且是掌握的一项重要技术。