PureScript FFI и Aff Monad: почему эффект никогда не запускается?

Я новичок в PureScript, и мне нужна помощь, чтобы понять, почему функция FFI, смоделированная с помощью монады Aff, у меня не работает.

Ожидаемое поведение — запись сообщения «keyMessage» в консоль через 1000 мс.

Вместо этого программа просто зависает на неопределенный срок после следующего вывода:

Compiling Main
* Build successful.
Waiting for message...

Main.purs:

module Main where

import Prelude
import Control.Monad.Aff (Aff, Fiber, launchAff)
import Control.Monad.Aff.Console (log)
import Control.Monad.Eff (Eff, kind Effect)
import Control.Monad.Eff.Console (CONSOLE)

main :: forall e. Eff (console :: CONSOLE, to :: TIMEOUT | e) (Fiber (console :: CONSOLE, to :: TIMEOUT | e) Unit)
main = launchAff do
  log "Waiting for message..."
  m <- message "key"
  log m

foreign import data TIMEOUT :: Effect

foreign import message :: forall e. String -> Aff (to :: TIMEOUT | e) String

Main.js:

'use strict';

exports.message = function(key) {
  return function(errback, callback) {
    var timeout = setTimeout(function() {
      callback(key + 'Message');
    }, 1000);

    return function() {
      return function (cancelErrback, cancelCallback) {
        clearTimeout(timeout);
        return cancelCallback();
      };
    };
  };
};

Заранее спасибо за ваши идеи!


person Nick Saunders    schedule 06.02.2018    source источник
comment
Нет времени писать полный ответ, но это должно вас заставить: используйте makeAff и используйте Eff в импорте внешних функций.   -  person Felix Schlitter    schedule 07.02.2018


Ответы (1)


Если вы используете последнюю основную версию purescript-aff (v4 или более позднюю), тогда представление Aff во время выполнения изменилось, и вы больше не можете создать его напрямую, используя стиль функции errback/callback.

Взгляните на https://pursuit.purescript.org/packages/purescript-aff/4.0.2/docs/Control.Monad.Aff.Compat, в частности функции EffFnAff type / fromEffFnAff для объяснения того, как теперь работает эквивалентная вещь.

В качестве альтернативы вы также можете построить Affs с makeAff, но это потребует немного переформулировать ваш код FFI.

person gb.    schedule 07.02.2018