2014-09-04 1 views
3

Недавно я решил передать некоторый код javascript в Fay, чтобы я мог гарантировать правильность шрифта, и чтобы я мог аккуратно обрабатывать асинхронный способ (а также экспериментировать). Я создал несколько объектов javascript, единственной целью которых было синхронизировать параллельные вызовы ajax. Я совершенно новый для Хаскелла.Асинхронные вызовы Haskell Fay

В Fay я надеялся убрать несколько вызовов ajax и использовать, скажем, Control.Monad.Parallel.sequence, чтобы заставить их синхронизировать. Тем не менее, я застрял и отчаянно нуждаюсь в руководстве, потому что fay-jquery AJAX functions не возвращают монаду для успешных/неудачных обратных вызовов, а this example in the fay snaplet тоже. Все они возвращают монаду Fay(), которая, по-видимому, предназначена для упорядочения ленивых звонков Хакелла в строгие javascript-выражения вместе, тогда как я вроде как ожидал чего-то вроде кортежа (Fay(), IO (либо SuccessResult FailureResult)), так как стрельба от запроса AJAX приводит к двум различным действиям.

У меня есть много вопросов по этому поводу:

  1. Является продолжением монады, что я ищу?
  2. Есть ли модули, которые работают с Fay, и использовать эту монаду для асинхронного javascript?
  3. Поскольку побочный эффект fay-jquery's AJAX functions происходит после чего-либо связанного или упорядоченного после возвращенного Fay(), делает ли это функции нечистыми?
  4. Я заметил continuation monad in the Fay repo - Почему он не используется в самом Fay? Единственное, что я могу найти, это this gist which wraps async node.js fs calls.

Ответы были бы высоко оценены! Они бы очень помогли моему шаткому пониманию этого материала.

ответ

2
  1. Да. Пример Cont практически выполняет то, что вы хотите, без обработки ошибок.
  2. ^
  3. Это зависит от вашего определения «нечистый». Я бы сказал, что функция, возвращаемая перед всеми ее эффектами, может быть чистым. Это касается почти всех ленивых вычислений в Haskell. см., например, Haskell's forkIO :: IO() -> IO ThreadId
  4. Я не уверен, что вы имеете в виду под «в самом Fay». Я не думаю, что Prelude должен использовать это, но в других библиотеках можно использовать Cont, и если вы хотите, чтобы вы не захотели сделать пакет из примера.
+0

Благодарим за ответ. Я изучал себя, и я решил, что продление примера Cont действительно действительно то, что я хочу. Пример необходим, потому что Control.Monad.Cont полагается на классы типов, которые не поддерживаются Fay. – user1158559

+0

Конечно, для функции с побочными эффектами, которая должна быть чистой, она должна возвращать представление этих побочных эффектов. Например, 'forkIO' немедленно вернется с чем-то типа' IO ThreadID', который представляет побочный эффект потока, создаваемого некоторое время в будущем. Поскольку привязка функции к fay monad означает только то, что эта функция выполняется сразу после функции, которая создала монаду Fay, то, конечно, монада Fay не представляет побочный эффект вызова AJAX после успеха или неудачи, поэтому вызов AJAX должно быть нечисто. – user1158559

+0

4 - хороший момент - сам Fay как компилятор Haskell для JS не нужен для продолжения монады. Тем не менее, я задавался вопросом, было ли это что-то, что может быть очень полезно для преодоления разрыва между обратными вызовами Javascript и использованием Hadsell для монадов для обработки async. Лично, часть моей мотивации для поиска в Fay заключалась в том, чтобы увидеть, могу ли я использовать монады для более чистого способа синхронизации асинхронных вызовов. – user1158559