我刚刚开始研究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".
谢谢!
在F#中,您可以重新定义几乎所有内容并隐藏现有定义.这适用于两种类型(实际上类型有关于阴影的不同行为,它们在打开命名空间时它们会影响它们的值)和值但不可互换,因为值和类型(以及模块)可以在范围内以某种方式同时共存.编译器将尽力找出哪一个.
你不是被迫的,但是在F#中使用let绑定大写是一种常见的好习惯.
关于你的第二个问题,你在右侧使用的类型参数在作业的左侧不存在,它应该是:
type List<'T> = Microsoft.FSharp.Collections.List<'T>
Run Code Online (Sandbox Code Playgroud)
但请注意,filter这不属于该类型.它在List模块中定义.