Функция PureScript FFI без возвращаемого значения, только побочные эффекты

Как правильно вызвать / определить стороннюю функцию, которая ничего не возвращает. Что я делаю неправильно?

Renderer.purs:

module Renderer where
import Prelude
import Effect (Effect)

foreign import renderMd :: String -> Effect Unit

Renderer.js:

var md = require('markdown-it')();
exports.renderMd = function(str) {
  document.body.append( md.render(str) );
}

Наконец звонит с:

import React.Basic.DOM as R
import React.Basic.DOM.Events (targetValue)
import React.Basic.Events as Events

R.textarea
  { onChange: Events.handler targetValue $ maybe (pure unit) renderMd
  }

Компилирует нормально, но дает:

Uncaught TypeError: cb(...) is not a function

в определении того, что, вероятно, Purescript-реагировать-основные handler, составлено:

var handler = function (v) {
    return function (cb) {
        return function ($22) {
            return cb(v($22))();
        };
    };
};

1 ответ

Решение

Я думаю, что решение состоит в том, чтобы обернуть результат вашей функции FFI в функцию с нулевым аргументом:

var md = require('markdown-it')();
exports.renderMd = function(str) {
  return function() {
    document.body.append( md.render(str) );
  }
}

Эта глава превосходной книги PureScript by Example упоминает об этом: https://leanpub.com/purescript/read

Я должен признать, что это менее чем очевидно, но на самом деле это имеет смысл: перенос эффективного результата в функцию задерживает ее оценку до тех пор, пока функция не будет вызвана, что необходимо для контроля побочных эффектов.

Другие вопросы по тегам