Следуя этим ответам, я реализовал общую функцию лифта в своей программе:
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
)?