Подтвердить что ты не робот

Каков трюк showS в Haskell?

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

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

4b9b3361

Ответ 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 для полного экземпляра.)

Ответ 2

showS использует подход с разностным списком для эффективного конкатенации отдельных компонентов показанного значения. Функция принимает отображаемое значение и строку для добавления к результату. Добавленная строка передается вплоть до самого правого значения, пока она не дойдет до листа, где она фактически добавлена.

Здесь описание списков различий (включая showS) здесь http://www.haskell.org/haskellwiki/Difference_list