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

Ral*_*hie 5 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
Run Code Online (Sandbox Code Playgroud)

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

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

s95*_*163 1

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

\n\n
\n

\xce\xbb .\\SO180207.exe
\n 添加 10
\n 添加 5
\n 添加 5
\n [||]

\n
\n\n

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

\n\n

这是该项目的结构:

\n\n

MyModule.fs 文件:

\n\n
module internal MyModule.Types \n\ntype Action =\n    | Add of int\n    | Update of int * string\n    | Delete of string\n\nlet x = Add 5\nprintfn "%A" x\n
Run Code Online (Sandbox Code Playgroud)\n\n

程序.fs文件:

\n\n
module MyModule.Program\nopen MyModule.Types\n\n[<EntryPoint>]\nlet main argv =\n    let x = Add 10 \n    printfn "%A" x // prints Add 10 \n    printfn "%A" MyModule.Types.x // prints Add 5 twice\n    printfn "%A" argv \n    0 // return an integer exit code\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,也许您可​​以提供更多 F# 版本以及运行环境的信息。也可以在override x.ToString()您的类型中。

\n\n

附加评论:
\n说实话,内部模块可能有一些东西,就好像我覆盖了ToString(),内部模块显然不喜欢它,并以 终止StackOverFlowException。例如,无需internal修饰符即可工作:

\n\n
module MyModule.Types \n\ntype Action =\n    | Add of int\n    | Update of int * string\n    | Delete of string\n    override x.ToString() = sprintf "%A" (x,x)\nlet x = Add 5\nprintfn "%A" x\nprintfn "%A" (x.ToString()) |> ignore\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

\xce\xbb .\\SO180207.exe
\n 添加 10
\n 添加 5
\n "(添加 5,添加 5)"
\n 添加 5
\n [||]

\n
\n