Общий класс лифта

Я только что взломал следующий класс следующим образом:

{-# 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

Это позволяет поднимать произвольное количество уровней, что может быть полезно для универсальных функций, которые применяются к различным размерам стека трансформаторов. Два вопроса:

  1. Я изобретаю колесо? Это уже существует и если да, то где?
  2. Это разумно или глупо?

0 ответов

Другие вопросы по тегам