В чем заключается трюк showS в Haskell?

Я видел ссылки на трюк showS для построения строк (например, в этом обсуждении ), но я никогда не видел хорошего его описания .

Что такое трюк с showS?

26
задан luispedro 8 February 2012 в 16:58
поделиться

1 ответ

В стандартной библиотеке 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 для полного экземпляра.)

42
ответ дан 28 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: