Я видел ссылки на трюк showS
для построения строк (например, в этом обсуждении ), но я никогда не видел хорошего его описания .
Что такое трюк с showS?
В стандартной библиотеке ShowS
определяется как:
type ShowS = String -> String
Это список разностей . Хитрость в том, что строка xs
представляется как ShowS
функцией, которая добавляет ее в любой другой список: (xs ++)
. Это позволяет эффективно объединять, избегая проблем вложенного левоассоциативного сцепления (то есть ((as ++ bs) ++ cs) ++ ds
). Например:
hello = ("hello" ++)
world = ("world" ++)
-- We can "concatenate" ShowS values simply by composing them:
helloworld = hello . world
-- and turn them into Strings by passing them an empty list:
helloworld' = helloworld ""
Он называется ShowS
, потому что он используется в реализации стандартного класса типов Show
, чтобы обеспечить эффективное show
создание больших глубоко вложенных структур; как и show
, вы можете реализовать showsPrec
, который имеет тип:
showsPrec :: (Show a) => Int -> a -> ShowS
Это позволяет обрабатывать приоритет оператора и возвращает значение ShowS
. Стандартные экземпляры реализуют это вместо show
для эффективности; show a
затем определяется в терминах этого, как showsPrec 0 a ""
. (Это определение по умолчанию содержится в самом классе типов Show
, поэтому вы можете просто реализовать showsPrec
для полного экземпляра.)