为什么不在文本格式中使用F#中的内部模块?

时间:2018-02-06 22:39:15

标签: f# text-formatting

以下代码未按预期格式化字符串(它只打印完全限定的类名):

module internal MyModule.Types

type Action =
    | Add of int
    | Update of int * string
    | Delete of string

module internal MyModule.Print

open MyModule.Types

let printStuff (x:Action) =
    printfn "%A" x

但是,如果未将MyModule.Types指定为internal,则格式设置将按预期工作。为什么格式化不适用于internal模块?它与反射有关吗?除了将模块公开之外,还有解决方法吗?

我应该提到模块是在单独的.fs文件中。

1 个答案:

答案 0 :(得分:1)

这对我有用,例如我得到输出:

  

λ。\ SO180207.exe
  加10   添加5
  添加5
  [||]

您可以看到Add 10已打印出来。此外,当我访问内部模块时,值和printfn "%A"语句都被执行了。

这是项目的结构:

MyModule.fs文件:

module internal MyModule.Types 

type Action =
    | Add of int
    | Update of int * string
    | Delete of string

let x = Add 5
printfn "%A" x

Program.fs文件:

module MyModule.Program
open MyModule.Types

[<EntryPoint>]
let main argv =
    let x = Add 10 
    printfn "%A" x // prints Add 10 
    printfn "%A" MyModule.Types.x // prints Add 5 twice
    printfn "%A" argv 
    0 // return an integer exit code

所以也许你可以提供更多关于F#版本的信息,以及你正在运行的环境。也可以在你的类型中override x.ToString()

补充评论:
说实话,内部模块可能存在某些内容,就像我覆盖ToString()一样,内部模块显然不喜欢它,并以StackOverFlowException终止。例如。这没有internal修饰符:

module MyModule.Types 

type Action =
    | Add of int
    | Update of int * string
    | Delete of string
    override x.ToString() = sprintf "%A" (x,x)
let x = Add 5
printfn "%A" x
printfn "%A" (x.ToString()) |> ignore
  

λ。\ SO180207.exe
  加10   添加5
  “(加5,加5)”
  添加5
  [||]