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