Да кажем, че имате структура от данни (заимствана от този въпрос):
data Greek = Alpha | Beta | Gamma | Delta | Eta | Number Int
Сега човек може да го направи екземпляр на Show
, като добави deriving Show
към тази инструкция.
Кажете обаче, че искаме да покажем Number Int
като:
instance Show Greek where
show (Number x) = show x
-- ...
Проблемът е, че трябва да посочите всички останали части от Greek
данните, както и като:
show Alpha = "Alpha"
show Beta = "Beta"
За този малък пример това разбира се е възможно. Но ако броят на опциите е дълъг, това изисква голямо количество работа.
Чудя се дали е възможно да осъществя достъп до изпълнението на „показване по подразбиране“ и да го извикам със заместващ знак. Например:
instance Show Greek where
show (Number x) = show x
show x = defaultShow x
По този начин вие „внедрявате“ специфичните модели, които се различават от подхода по подразбиране, а останалите модели се разрешават от „резервния механизъм“.
Нещо малко подобно на замяна на метод с препратка към super.method
в обектно-ориентираното програмиране.
.. deriving Show
и след това да имате някакъв красив клас за печат (или просто функция), който показва данните както искате. Също така, няма такова нещо като замяна на метод в Haskell, илиsuper.method
, защото в Haskell няма подвъвеждане. - person user2407038   schedule 23.02.2015show
генерира низ, съдържащ Haskell израз, който, след като бъде оценен, връща първоначалната стойност. Ако имате нужда от нещо друго, трябва да декларирате различна функция (евентуално в нейния собствен клас). - person chi   schedule 23.02.2015read (show [[1..],[2]])
няма да получи оригиналния списък обратно. Като се има предвид това, вярно е, че договорът често се нарушава в кода на приложението, така че това, което се опитвате да направите, не е необичайно. Понякога е доста удобно просто да заменитеshow
, за да бъдете по-четими и да забравите синтаксиса на Haskell. - person chi   schedule 23.02.2015show
не произвежда валиден синтаксис на Haskell, той все още обикновено се счита за ориентиран към програмиста. Покажи ми да бъде текстово представяне на данните, за да мога да разбера какво е, не показва тази стойност като текст за крайния потребител. От гледна точка на Python това еrepr
, а неstr
. Така че показването на някоиGreek
стойности по начин, който е неразличим от цели числа, е малко миризма на код. - person Ben   schedule 22.12.2015show
да рендираString
стойности без кавички или списъци без скоби. Твърде много стандартни екземпляри третиратshow
като извеждащ код, за да може наистина лесно да се използва за показване. - person Ben   schedule 22.12.2015