为什么在 F# 的内部模块中无法使用 %A 文本格式化?

5
以下代码未按预期格式化字符串(仅打印完全限定类名):
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个回答

1
这对我有效,例如我得到以下输出结果:

λ .\SO180207.exe
Add 10
Add 5
Add 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#版本和运行环境的更多信息。您还可以在类型内部覆盖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
[||]


1
我编辑了问题,以更准确地反映我正在运行的实际代码。该代码在 .NET Framework 4.6.1 上运行 F# 4.4.1.0。 - Ralphie
@Ralphie,类似的设置,但从您所描述的情况来看,printfn在设置内部修饰符时使用的是"%O"而不是"%A"。我不太确定为什么会这样。 - s952163

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接