Связь между `DList` и` [] `с Codensity

Я экспериментировал сCodensity в последнее время, который должен относитьсяDList с[] между прочим Во всяком случае, я никогда не нашел код, который заявляет об этом отношении. После некоторых экспериментов я закончил с этим:

{-# LANGUAGE RankNTypes #-}
module Codensity where

newtype Codensity f a = Codensity
  { runCodensity :: forall b. (a -> f b) -> f b }

type DList a = Codensity [] [a]

nil :: DList a
nil = Codensity ($ [])

infixr 5 `cons`
cons :: a -> DList a -> DList a
cons x (Codensity xs) = Codensity ($ (xs (x:)))

append :: DList a -> DList a -> DList a
append (Codensity xs) ys = Codensity ($ (xs (++ toList ys)))

toList :: DList a -> [a]
toList xs = runCodensity xs id

fromList :: [a] -> DList a
fromList xs = Codensity (\k -> k xs)

Однако определениеDList чувствует себя немного неприглядным в моем примере. Есть ли другой способ заявить об этом отношении? Это даже правильный способ сделать это?

Ответы на вопрос(2)

Ваш ответ на вопрос