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文件中.
这对我有用,例如我得到输出:
\n\n\n\n\n\xce\xbb .\\SO180207.exe
\n
\n 添加 10
\n 添加 5
\n 添加 5
\n [||]
可以看到是Add 10打印出来的。此外,当我访问内部模块时,值和printfn "%A"语句都被执行。
这是该项目的结构:
\n\nMyModule.fs 文件:
\n\nmodule 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\nRun Code Online (Sandbox Code Playgroud)\n\n程序.fs文件:
\n\nmodule 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\nRun Code Online (Sandbox Code Playgroud)\n\n因此,也许您可以提供更多 F# 版本以及运行环境的信息。也可以在override x.ToString()您的类型中。
附加评论:
\n说实话,内部模块可能有一些东西,就好像我覆盖了ToString(),内部模块显然不喜欢它,并以 终止StackOverFlowException。例如,无需internal修饰符即可工作:
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\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\xce\xbb .\\SO180207.exe
\n
\n 添加 10
\n 添加 5
\n "(添加 5,添加 5)"
\n 添加 5
\n [||]