首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向purescript函数发送javascript对象

向purescript函数发送javascript对象
EN

Stack Overflow用户
提问于 2019-08-21 12:29:27
回答 1查看 91关注 0票数 2

我正在像这样集成javascript和PureScript:

代码语言:javascript
复制
  //App.js
  const Calculator = require('../purescript/output/Main/index')

  const config = {
    grossIncome: 128183912,
    married: true
  }

  const result = Calculator.run(config)

但是,我不知道如何编写PureScript部件来接受javascript对象。我们可以假设所有输入都是有效的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-21 14:47:01

PureScript中相应的类型定义如下所示:

代码语言:javascript
复制
type CalculatorConfig = {
    grossIncome :: Int,    -- or should it be Number?
    married :: Boolean
}

函数run将如下所示:

代码语言:javascript
复制
run :: CalculatorConfig -> String
run cfg = if cfg.married then "Married" else "Bachelor"

(假设您的结果类型是String;在这里替换您的实际类型)

但是,这只适用于纯函数,即不产生任何副作用的函数,例如输入/输出、显示UI、发射导弹等。如果您的函数确实需要有副作用,那么它的返回类型应该是Effect String而不是String

代码语言:javascript
复制
run :: CalculatorConfig -> Effect String
run cfg = do
   log "Running calculator!"
   if cfg.married then pure "Married" else pure "Bachelor"

在这种情况下,您必须从JavaScript这样调用它:

代码语言:javascript
复制
const result = Calculator.run(config)()

看到最后的额外父母了吗?这就是Effect作为一个函数被编译成JavaScript的方式。这意味着run返回的不是一个String,而是一个程序(又名函数),一旦执行,它将生成一个String

如果您真的想让JavaScript不知道任何类似的额外内容,可以将run函数导出为EffectFn1,这是一个特殊的包装器,允许将PureScript风格的有效函数表示为JavaScript样式的函数:

代码语言: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

代码语言:javascript
复制
run :: EffectFn1 CalculatorConfig String
run = mkEffectFn1 \cfg -> do
   log "Running calculator!"
   if cfg.married then pure "Married" else pure "Bachelor"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57591668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档