Я пишу некоторые lift
функции, которые принимают функцию поля записи, некоторые параметры и затем lift
действие, сохраненное в записи, в другой Monad
, где я работаю:
liftCapability :: Has capability e
=> ( capability -> IO a )
-> ReaderT e IO a
liftCapability f = do
capability <- asks getter
lift $ f capability
Проблема в том, что я прибыл в место, где у меня есть множество этих lift
функций, каждая из которых предназначена для разной арности, если мне нужно вызвать ее с большим количеством параметров:
liftCapability1 :: Has capability e
=> ( capability -> a -> IO b )
-> a
-> ReaderT e IO b
liftCapability1 f a = do
capability <- asks getter
lift $ f capability a
liftCapability2 :: Has capability e
=> ( capability -> a -> b -> IO c )
-> a
-> b
-> ReaderT e IO c
liftCapability2 f a b = do
capability <- asks getter
lift $ f capability a b
Есть лиспособ абстрагировать применение последних аргументов функции, которая работала как eta-Reduce?
До сих пор я пытался использовать curryN
и uncurryN
из пакета tuple , но это не сработает, так как не может содержать менее двух аргументов:
liftC f =
liftC' f . curryN
where
liftC' f a = do
c <- asks getter
lift $ (f c) (uncurryN a)
Возможно ли это, или я обречен иметь функцию на арность?