Haskell在F#中的“派生表演”?

时间:2010-02-19 10:29:40

标签: .net haskell f# discriminated-union object-to-string

在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之类的内容?

1 个答案:

答案 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要长一些,但至少你不必自己实现打印。