gpt4 book ai didi

f# - 为什么 %A 文本格式不适用于 F# 中的内部模块?

转载 作者:行者123 更新时间:2023-12-04 21:32:09 26 4
gpt4 key购买 nike

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

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 文件中。

最佳答案

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

λ .\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

程序.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
Add 10
Add 5
"(Add 5, Add 5)"
Add 5
[||]

关于f# - 为什么 %A 文本格式不适用于 F# 中的内部模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48653134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com