我正在像这样集成javascript和PureScript:
//App.js
const Calculator = require('../purescript/output/Main/index')
const config = {
grossIncome: 128183912,
married: true
}
const result = Calculator.run(config)但是,我不知道如何编写PureScript部件来接受javascript对象。我们可以假设所有输入都是有效的。
发布于 2019-08-21 14:47:01
PureScript中相应的类型定义如下所示:
type CalculatorConfig = {
grossIncome :: Int, -- or should it be Number?
married :: Boolean
}函数run将如下所示:
run :: CalculatorConfig -> String
run cfg = if cfg.married then "Married" else "Bachelor"(假设您的结果类型是String;在这里替换您的实际类型)
但是,这只适用于纯函数,即不产生任何副作用的函数,例如输入/输出、显示UI、发射导弹等。如果您的函数确实需要有副作用,那么它的返回类型应该是Effect String而不是String。
run :: CalculatorConfig -> Effect String
run cfg = do
log "Running calculator!"
if cfg.married then pure "Married" else pure "Bachelor"在这种情况下,您必须从JavaScript这样调用它:
const result = Calculator.run(config)()看到最后的额外父母了吗?这就是Effect作为一个函数被编译成JavaScript的方式。这意味着run返回的不是一个String,而是一个程序(又名函数),一旦执行,它将生成一个String。
如果您真的想让JavaScript不知道任何类似的额外内容,可以将run函数导出为EffectFn1,这是一个特殊的包装器,允许将PureScript风格的有效函数表示为JavaScript样式的函数:
runImpl :: CalculatorConfig -> Effect String
runImpl cfg = do
log "Running calculator!"
if cfg.married then pure "Married" else pure "Bachelor"
run :: EffectFn1 CalculatorConfig String
run = mkEffectFn1 runImpl或者用更短的方式来做相同的事情,而不需要单独定义runImpl。
run :: EffectFn1 CalculatorConfig String
run = mkEffectFn1 \cfg -> do
log "Running calculator!"
if cfg.married then pure "Married" else pure "Bachelor"https://stackoverflow.com/questions/57591668
复制相似问题