Haskell "Получение шоу" в F #?

В 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

и, очевидно, он становится намного хуже с более сложными типами.

Любой способ получить что-то вроде deriving Show в F #?

Ответ 1

Функции печати F #, такие как printf, могут форматировать любой тип данных, если вы используете спецификатор формата %A (они используют ToString, если вы указываете %O). Вы можете реализовать ToString с помощью sprintf, который возвращает форматированную строку:

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

Это печатает, например, "Pos (1, 2)", и он работает для большинства типов F # (списки, союзы, записи, кортежи). Это немного дольше, чем просто добавление deriving Show, но по крайней мере вам не нужно выполнять печать самостоятельно.