没有 return 值的 PureScript FFI 函数,只有副作用
PureScript FFI function without return value, only side-effects
如何正确 call/define 没有 return 任何东西的外部函数。我做错了什么?
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-react-basic的定义中handler
,编译:
var handler = function (v) {
return function (cb) {
return function () {
return cb(v())();
};
};
};
我认为解决方案是将 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
我不得不承认,这不是很明显,但它实际上是有道理的:将有效结果包装在一个函数中会延迟其评估,直到调用该函数,这是控制副作用所需要的。
如何正确 call/define 没有 return 任何东西的外部函数。我做错了什么?
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-react-basic的定义中handler
,编译:
var handler = function (v) {
return function (cb) {
return function () {
return cb(v())();
};
};
};
我认为解决方案是将 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
我不得不承认,这不是很明显,但它实际上是有道理的:将有效结果包装在一个函数中会延迟其评估,直到调用该函数,这是控制副作用所需要的。