Общая идиома в Haskell, разностные списки, представляет собой список xs
как значение (xs ++)
. Тогда (.)
становится "(++)
", а id
становится "[]
" (на самом деле это работает для любого моноида или категории). Поскольку мы можем составлять функции в постоянное время, это дает нам хороший способ эффективно создавать списки путем добавления.
К сожалению, тип [a] -> [a]
больше, чем тип функций формы (xs ++)
- большинство функций в списках делают что-то отличное от предшествующего аргумента.
Один подход вокруг этого (как используется в dlist
) заключается в создании специального типа dlist
с интеллектуальным конструктором. Другой подход (используемый в ShowS
) заключается в том, чтобы нигде не принуждать ограничение и надеяться на лучшее. Но есть ли хороший способ сохранить все желаемые свойства списков различий при использовании типа, который точно соответствует размеру?