F#2.0命名空间警告

Ben*_*jol 8 f# namespaces

我刚刚安装了最新版本的F#,并打开了一个旧的解决方案,看看它会告诉我什么.

这是一个多文件解决方案,其中第一个文件包含List模块上的一些"扩展函数":

module List = 
    ///Given list of 'rows', returns list of 'columns' 
    let rec transpose lst =
        match lst with
        | (_::_)::_ -> List.map List.hd lst :: transpose (List.map List.tl lst)
        | _         -> []
Run Code Online (Sandbox Code Playgroud)

编译器不再喜欢这个,并说:

库或多文件应用程序中的文件必须以命名空间或模块声明开头,例如'namespace SomeNamespace.SubNamespace'或'module SomeNamespace.SomeModule'

但如果我这样做:

module Foo.List = 
Run Code Online (Sandbox Code Playgroud)

它说:

模块缩写必须是简单名称,而不是路径

我在这里错过了什么?那个'特殊'案例的解决方案是什么,我正在扩展来自其他地方的模块?

Joh*_*bom 6

命名空间显式:

namespace Microsoft.FSharp.Collections

module List =  
    ///Given list of 'rows', returns list of 'columns'  
    let rec transpose lst = 
        match lst with 
        | (_::_)::_ -> List.map List.head lst :: transpose (List.map List.tail lst) 
        | _         -> []
Run Code Online (Sandbox Code Playgroud)

请注意,List.hdList.tl已重命名为List.headList.tail.

  • 答案的另一半非常令人困惑,如果你没有命名空间,只有一个模块,你不能在模块声明之后加上一个=.但是如果你有一个命名空间,你需要一个= (4认同)
  • :) - 添加它们,因为您已经在List模块中添加了函数... (2认同)