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

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

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 Ответ

0 голосов
/ 12 октября 2018

Я думаю, что решение состоит в том, чтобы обернуть результат вашей функции 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#leanpub-auto-representing-side-effects

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

...