Следуя этим ответам, я реализовал общую функцию лифта в своей программе:
liftTupe :: (x -> c x) -> (a, b) -> (c a, c b) --This will error
liftTuple :: (forall x. x -> c x) -> (a, b) -> (c a, c b)
Я понимаю, что в этом контексте forall позволяет x быть любого типа ([], Maybe и т.д.).
Теперь я изучаю определение >>= в Monads:
class Applicative m => Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
Я не могу понять роль этого forall в определении функции? Поскольку, в отличие от liftTuple, он не привязан к определенной функции (x -> c x)?