Эффективный способ печати имен свойств в Haskell - PullRequest
0 голосов
/ 29 июня 2018

Здравствуйте, я новичок в Haskell, и мне было интересно:

Для каждого нового определенного конструктора типа, даже если это что-то с глубиной 0, например ::1003*

data Letter =A | B | C deriving (Show)

Должен ли я предоставить

instance Show Type
    Letter A = "A"
    Letter B ="B"
    Letter C ="C"

Я понимаю, что для вложенных типов вы должны предоставить Show реализацию, но для чего-то простого, нет ли другого способа просто использовать что-то эквивалентное отражению (C #)? Просто получите имя свойства / имя конструктора и ToString -it ?

Предоставляют ли программисты на Haskell экземпляры Show для любого типа adhoc, который они создают?

Под вложенными типами я подразумеваю наличие простого ADT внутри другого ADT внутри другого и т. Д., Но все, что вам нужно, это получить их имена:

например:

data Person = Male | Female
data IsMarried=Yes | No

data Worker=Worker{
            person::Person,
            status::IsMarried
            }

Для такого типа вложений мне действительно нужно определить instance из Show для всех этих конструкторов типов, даже если все, что я хочу, это чтобы их имя было "stringified"?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Поскольку @AJFarmar редактирует его ответ, когда я его изменяю:

Должен ли я предоставить [экземпляр show для каждого типа?]

Да. Либо путем получения его с помощью deriving Show, либо путем предоставления экземпляра типа

instance Show -type- where...

Я понимаю, что для вложенных типов вы должны предоставить Показать реализацию [...]

Да, компилятор не будет добавлять необходимые экземпляры для Show.

data Test = Test -- no instance for Show

test :: String
test = show $ (Just Test :: Maybe Test)

Не скомпилируется с сообщением об ошибке:

main.hs:4:8: error:
    • No instance for (Show Test) arising from a use of ‘show’
    • In the expression: show $ (Just Test :: Maybe Test)
      In an equation for ‘test’: test = show $ (Just Test :: Maybe Test)

Именно поэтому вам необходимо иметь экземпляр Show для a. Однако, если он уже существует, вам не нужно указывать новый.

0 голосов
/ 29 июня 2018

Должен ли я предоставить [экземпляр show для каждого типа?]

Нет, потому что вы автоматически получили Show:

data Letter = A | B | C deriving (Show)
--                      ^^^^^^^^^^^^^^^ Here

Однако, если вы хотите «умнее» show, например, отображать пользовательский список как [1,2,3], а не беспорядок конструкторов, вам придется написать его самостоятельно.

Вы можете сделать то же самое для ряда классов (включая Eq, Ord, Read, Enum и Bounded), но большинство классов, включая определяемые пользователем классы, должны быть реализованы вручную без использования определенных языковых расширений.

Я понимаю, что для вложенных типов вы должны предоставить Показать реализацию [...]

Вы нет! Например, я могу написать это:

data Maybe a = Just a | Nothing deriving (Show)

И компилятор автоматически добавит необходимые ограничения, несмотря на то, что это «вложенный» тип.

Просто получить имя свойства / имя конструктора и ToString-it?

В Хаскеле нет «свойств» - не думайте с точки зрения C # здесь. show является эквивалентом ToString. Тем не менее, форма отражения типа доступна в TypeReps , хотя я бы посоветовал не использовать это, пока у вас не будет четкого понимания Haskell.

...