10

deriving Show在 Haskell 中,通过简单地添加到类型定义中,很容易使代数类型/可区分联合“可显示”为字符串。

在 F# 中,我最终会编写如下内容:

type Pos = 
    | Pos of int * int
    override this.ToString() = 
        match this with
        Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp

显然,更复杂的类型会变得更糟。

deriving Show有什么方法可以在 F#中获得类似的东西?

4

1 回答 1

20

如果您使用格式说明符(如果您指定,它们将使用),则F# 打印函数(例如)printf能够合理地格式化任何数据类型。您可以使用which 返回格式化的字符串来实现:%AToString%OToStringsprintf

type Pos =  
    | Pos of int * int 
    override x.ToString() = sprintf "%A" x 

例如,这会打印“Pos (1, 2)”,它适用于大多数 F# 类型(列表、联合、记录、元组)。它比添加要长一点,deriving Show但至少您不必自己实现打印。

于 2010-02-19T11:37:02.533 回答