代码之家  ›  专栏  ›  技术社区  ›  mb21

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

  •  0
  • mb21  · 技术社区  · 6 年前

    渲染器.purs:

    module Renderer where
    import Prelude
    import Effect (Effect)
    
    foreign import renderMd :: String -> Effect Unit
    

    渲染器.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 ($22) {
                return cb(v($22))();
            };
        };
    };
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   stholzm    6 年前

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

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

    这本好书的这一章 PureScript示例 https://leanpub.com/purescript/read#leanpub-auto-representing-side-effects

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