Я не самый большой поклонник varargs, но я всегда считал, что стили аппликативного (f <$> x <*> y) и идиомы ([i| f x y |]) слишком много символов. Обычно я предпочитаю идти liftA2 f x y, но я тоже думаю, что A2 немного уродлив. Из этого вопроса, я узнал, что в Haskell можно реализовать функции vararg. Таким образом, можно ли использовать тот же принцип для реализации функции подъема, что:
lift f a b == pure f <*> a <*> b
Я попытался заменить + на <*> на цитируемый код:
class Lift r where
lift :: a -> r
instance Lift a where
lift = id
instance (Lift r) => Lift (a -> r) where
lift x y = lift (x <*> y)
Но мне не удалось получить правильные типы...