PureScript FFI 函数没有返回值,只有副作用

mb2*_*b21 1 ffi purescript

如何正确调用/定义不返回任何内容的外部函数。我究竟做错了什么?

渲染器.purs:

module Renderer where
import Prelude
import Effect (Effect)

foreign import renderMd :: String -> Effect Unit
Run Code Online (Sandbox Code Playgroud)

渲染器.js:

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

最后调用:

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
  }
Run Code Online (Sandbox Code Playgroud)

编译正常,但给出:

Uncaught TypeError: cb(...) is not a function
Run Code Online (Sandbox Code Playgroud)

在可能是 purescript-react-basic 的定义中handler,编译:

var handler = function (v) {
    return function (cb) {
        return function ($22) {
            return cb(v($22))();
        };
    };
};
Run Code Online (Sandbox Code Playgroud)

sth*_*lzm 5

我认为解决方案是将 FFI 函数的结果包装在零参数函数中:

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

优秀书籍PureScript by Example的这一章提到了它:https://leanpub.com/purescript/read#leanpub-auto-representing-side-effects

我必须承认,这不太明显,但实际上是有道理的:将有效结果包装在函数中会延迟其评估,直到调用函数为止,这是控制副作用所必需的。