在F#中键入name作为标识符

xne*_*neg 3 f#

我刚刚开始研究F#并且不小心写了这个绑定

let List = 1
Run Code Online (Sandbox Code Playgroud)

现在当我尝试获取像'filter'这样的List方法时,我得到了这个错误

错误FS0039:未定义字段,构造函数或成员"过滤器".

当然使用完整类型名称的方法Microsoft.FSharp.Collections.List.filter仍然有效.

我想知道为什么可以在F#中使用类型名称作为标识符,以及如何将名称List设置为从中键入List Microsoft.FSharp.Collections.

当我试图像这样重新分配时

type List = Microsoft.FSharp.Collections.List<'T>
Run Code Online (Sandbox Code Playgroud)

我明白了

错误FS0039:未定义类型参数"T".

谢谢!

Gus*_*Gus 6

在F#中,您可以重新定义几乎所有内容并隐藏现有定义.这适用于两种类型(实际上类型有关于阴影的不同行为,它们在打开命名空间时它们会影响它们的值)和值但不可互换,因为值和类型(以及模块)可以在范围内以某种方式同时共存.编译器将尽力找出哪一个.

你不是被迫的,但是在F#中使用let绑定大写是一种常见的好习惯.

关于你的第二个问题,你在右侧使用的类型参数在作业的左侧不存在,它应该是:

type List<'T> = Microsoft.FSharp.Collections.List<'T>
Run Code Online (Sandbox Code Playgroud)

但请注意,filter这不属于该类型.它在List模块中定义.