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