Похоже, если вы передаете перенаправление URL обратно через те слои менеджеров/Facebook монады, то вы можете просто кормить его. Тип перенаправленного URL-адреса - Text
, который имеет экземпляр класса RedirectUrl
, необходимый для использования функции redirect
(см. documentation).
Вам должны быть в состоянии сделать эту работу с чем-то вроде:
getAccessTokenR :: Handler RepHtml
getAccessTokenR = do
url <- withManager $ \manager ->
FB.runFacebookT creds manager $
FB.getUserAccessTokenStep1 redirUrl []
redirect url
Там нет никакой реальной магии здесь, вы в основном имеют две модели высокого уровня происходит, один является «с» рисунком, который будет локализовать использование ресурса (в данном случае manager
), а другой - шаблон «запуска», который действительно используется трансформаторами Monad (не беспокойтесь о деталях этого еще!).
Значит, withManager
дает вам возможность использовать диспетчер, по-видимому, он заботится о некоторых настройках и удалении менеджера. Это, вероятно, напечатал что-то вроде
withManager :: (Manager -> Handler a) -> Handler a
Within, что вы на facebook бегун, который будет набран как:
runFacebookT :: Credentials -> Manager -> FacebookT Auth Handler a -> Handler a
Что в основном говорит, что если вы даете ему некоторые полномочия, менеджер, и некоторые Специальное вычисление Facebook (например, получение URL-адреса переадресации) может перевести это в вашу Монаду выбора (здесь мы выбираем Handler
, потому что это то, чего хочет withManager
). В вашем случае переменной типа a
является Text
URL-адреса переадресации.
Используя эту пару шаблонов и run
, мы получаем результат, что URL-адрес, который был поставлен в глубине там, пузырится в нашу монаду Handler
. Затем мы просто вытаскиваем его и передаем его функции redirect
!
Не можете ли вы просто вернуть URL-адрес на внешний уровень ('Handler'), а затем использовать' redirect' немедленно? – ScottWest
@ScottWest Ухаживайте за подробностями о том, что вы подразумеваете, возвращая его на внешний уровень? Я думал об этом, но не уверен, как это сделать с монадами и такими – Squazic
Не хватает места здесь, я постараюсь ответить ниже (но я не могу проверить его :)). – ScottWest