Функция 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
Я должен признать, что это менее чем очевидно, но на самом деле это имеет смысл: перенос эффективного результата в функцию задерживает ее оценку до тех пор, пока функция не будет вызвана, что необходимо для контроля побочных эффектов.