«Шоу вывода» Haskell в F #?
-
21-09-2019 - |
Вопрос
В 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
но, по крайней мере, вам не придется осуществлять печать самостоятельно.