在Haskell中,通过简单地将deriving Show
添加到类型定义中,可以很容易地将代数类型/区分联合“显示”为字符串。
在F#中,我最终会写下这样的内容:
type Pos =
| Pos of int * int
override this.ToString() =
match this with
Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp
显然,对于更复杂的类型,它会变得更糟。
任何方式在F#中获得deriving Show
之类的内容?
答案 0 :(得分:20)
如果使用printf
格式说明符,%A
等F#打印功能可以合理地格式化任何数据类型(如果指定ToString
,则使用%O
)。您可以使用ToString
实现sprintf
,返回格式化字符串:
type Pos =
| Pos of int * int
override x.ToString() = sprintf "%A" x
这打印例如“Pos(1,2)”,它适用于大多数F#类型(列表,联合,记录,元组)。这比仅添加deriving Show
要长一些,但至少你不必自己实现打印。