2012-06-08 2 views
0

Я в настоящее время использую пакет fb, чтобы написать приложение Yesod, которое берет данные из Facebook. В моем обработчике мне удалось выполнить первый этап проверки подлинности, но мне нужно перенаправить на URL-адрес, который возвращает getUserAccessTokenStep1, который я определил как fbRedirUrl. У меня возникли проблемы со всеми монадными обертками и типом проверки, чтобы я мог перенаправить на этот URL.Как перенаправить в монаде в Йесод?

getAccessTokenR :: Handler RepHtml 
getAccessTokenR = do 
    withManager $ \manager -> do 
    FB.runFacebookT creds manager $ do 
     fbRedirUrl <- FB.getUserAccessTokenStep1 redirUrl [] 
     liftIO $ print fbRedirUrl 
+0

Не можете ли вы просто вернуть URL-адрес на внешний уровень ('Handler'), а затем использовать' redirect' немедленно? – ScottWest

+0

@ScottWest Ухаживайте за подробностями о том, что вы подразумеваете, возвращая его на внешний уровень? Я думал об этом, но не уверен, как это сделать с монадами и такими – Squazic

+0

Не хватает места здесь, я постараюсь ответить ниже (но я не могу проверить его :)). – ScottWest

ответ

3

Похоже, если вы передаете перенаправление 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!

+0

Yup что сделал трюк! Благодаря! Теперь, чтобы порыться над проверкой типа и посмотреть, какую магию вы потянули. – Squazic

+0

Нет проблем! Я добавил немного больше объяснений, надеюсь, что это немного лучше, почему он действительно работает. – ScottWest

+0

Еще один подход - использовать «подъем» изнутри внутренней монады. –

Смежные вопросы