Связь между `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
чувствует себя немного неприглядным в моем примере. Есть ли другой способ заявить об этом отношении? Это даже правильный способ сделать это?