如何使用Fable定义和调用多参数函数

时间:2017-02-13 17:08:57

标签: javascript f# fable-f#

我正在尝试使用2个参数调用Redux.createStore,以下代码简化了签名,但我无法让FSharp理解我想要的内容:

class Customer
{
    /**
     * @ODM\Id
     * @ORM\Column(name="id", type="string")
     *
     * @JMS\Expose
     * @JMS\Type("string")
     *
     */
    protected $id;

    /**
     * @var integer
     * @ODM\Id(strategy="INCREMENT")
     * @ORM\Column(name="customerId", type="integer")
     *
     * @JMS\Expose
     * @JMS\Type("integer")
     *
     */
    protected $customerId;

因此,我想将createStore定义为一个需要2个整数的函数,而不是一个2个整数的元组,而不是一个接受一个int的函数,并返回一个接受一个int的函数(部分应用2个整数)。不,它是一个本机函数,它接受2个参数(比如整数)并返回一个int。

在示例中,有一个redux示例,只使用一个参数。

documentation显示如何创建一个带有多个参数的函数,但不知道如何定义类型以及如何调用这样的函数。

该示例确实显示了带有多个参数的定义但从不调用它,所以仍然不知道如何调用带有多个参数的js函数。

2 个答案:

答案 0 :(得分:2)

根据您的评论:

  

我试图弄清楚如何定义一个带有2个参数的js函数并用2个参数调用它。

答案是,就像你说的那样:

[<Import("*","Redux")>]
module redux =
    let createStore (a: int, b: int): int = jsNative

let store = redux.createStore (22, 42)

除了代码示例之外,我无法添加任何其他内容,因为我不确定您的实际问题是什么:您是否发现了一些不明显的内容(什么?),如果您尝试了这个,它没有以某种方式工作(如何?),或其他什么(什么?)。

答案 1 :(得分:0)

真的厌倦了尝试定义F#和Fable理解然后尝试调用它的类型。

现在我创建了一个名为JSI.js的JavaScript文件:

/**
 * JavaScipt Interop to call complex JavaScipt library methods 
 * where I have no clue how to define the type for in F#/Fable
 */
define(["exports","redux"],function(exports,Redux){
  exports.createStore = 
    (fn)=>
    (initialStore)=>{
      return Redux.createStore(
        (action,state)=>fn(action)(state)
        ,initialStore
      );
    }
});

然后在main.fsx中:

[<Import("*","../js/JSI")>]
module JSI =
    let createStore: 
      (
        (AppController.ApplicationModel -> Action -> AppController.ApplicationModel)
          -> AppController.ApplicationModel
          -> int
      ) = jsNative

let store = 
  JSI.createStore 
    applicationHandler
    AppController.defaultModel

这会将F#部分应用的函数换行/解包到具有Redux使用的多个参数的东西。