Haskell在F#中的"派生表演"?

Mir*_*anu 10 .net f# haskell 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
Run Code Online (Sandbox Code Playgroud)

显然,对于更复杂的类型,它会变得更糟.

有什么办法得到像deriving ShowF#的东西?

Tom*_*cek 20

printf如果使用%A格式说明符(ToString如果指定则使用它们%O),F#打印功能可以合理地格式化任何数据类型.你可以实现ToStringusing sprintf返回格式化的字符串:

type Pos =  
    | Pos of int * int 
    override x.ToString() = sprintf "%A" x 
Run Code Online (Sandbox Code Playgroud)

这打印例如"Pos(1,2)",它适用于大多数F#类型(列表,联合,记录,元组).这比仅仅添加deriving Show要长一些,但至少你不必自己实现打印.

  • 如何在F#中实现"派生读取"? (3认同)