Общий класс лифта
Я только что взломал следующий класс следующим образом:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
import Control.Monad.Trans.Class (MonadTrans, lift)
class GenericLift m1 m2 where
genericLift :: m1 a -> m2 a
instance GenericLift m m where
genericLift = id
instance (MonadTrans t, Monad m2, GenericLift m1 m2) => GenericLift m1 (t m2) where
genericLift = lift . genericLift
Это позволяет поднимать произвольное количество уровней, что может быть полезно для универсальных функций, которые применяются к различным размерам стека трансформаторов. Два вопроса:
- Я изобретаю колесо? Это уже существует и если да, то где?
- Это разумно или глупо?