Вопрос

В 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 #, такие как printf способны форматировать разумно любой тип данных, если вы используете %A спецификатор формата (они используют ToString если вы укажете %O).Вы можете реализовать ToString с использованием sprintf который возвращает отформатированную строку:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top