Всем привет.
Мне нужен список в Haskell, хранящий не какие-то конкретные типы, а абстрактные типы, являющиеся инстансами type классов. Например, объявить список из Eq и класть в него любой тип, который является инстансом Eq. Что-то слышал про existential types, h-lists, но не знаю, куда конкретно копать.
Понадобилось для примера ниже: имеем набор типов (Bounded a, Enum a, Ord a) => a , и это позволяет определять для каждого из них переполнение. На вход функции передаём [a, b, c, d] и, если при инкрементации a происходит переполнение, то оно автоматически передаётся в b и так далее.
import Control.Monad.Trans.State.Lazy
groupSuccWithCarry :: (Bounded a, Enum a, Ord a) => [a] -> [a]
groupSuccWithCarry (h : t) = let (carry, h') = succWithCarry h
in h' : evalState (carryOver t) carry
succWithCarry :: (Bounded a, Enum a, Ord a) => a -> (Bool, a)
succWithCarry x = let overflow = x == maxBound
in (overflow, if overflow then minBound else succ x)
carryOver :: (Bounded a, Enum a, Monad m, Ord a) => [a] -> StateT Bool m [a]
carryOver = mapM (\x -> do carry <- get
let (carry', x') = if carry then succWithCarry x else (False, x)
put carry'
return $ x')
Для
> data DayOfWeek = Sun | Mon | Tue | Wed | Thu | Fri | Sat deriving (Bounded, Enum, Eq, Ord, Show)
> groupSuccWithCarry [Sat, Sat, Fri, Sun, Wed]
[Sun, Sun, Sat, Sun, Wed]
работает, но нужна возможность передавать в ф-ию значения разных типов, лишь бы для них были определены соответствующие type классы.