"Производное шоу" на Хаскелле в F #? - PullRequest
10 голосов
/ 19 февраля 2010

В 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 Ответ

20 голосов
/ 19 февраля 2010
Функции печати

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, но, по крайней мере, вам не нужно реализовывать печать самостоятельно.

...