理解ReasonML / Bucklescript外部

时间:2017-11-12 11:58:27

标签: ocaml external ffi bucklescript reason-react

试着大致了解这里发生了什么。将ReasonApolloTypes.gql解释为使用Externals的示例是否有意义。

这是bs.module代码

[@bs.module] external gql : ReasonApolloTypes.gql = "graphql-tag";

bs.module告诉buckelscript我们想要使用FFI。

external告诉bs我们想要使用的FII的名称,我们将其值设置为ReasonApolloTypes.gql,这是我们在bsconfig中添加reason-apollo时安装的全局可用Reason模块bs-dependencies数组,以及package.json。如果打开node_modules / reason-apollo / src,您将看到全局可用的已定义Reason模块。

ReasonApolloTypes.re列在那里,包含一个名为gql的已定义类型。因此ReasonApolloType.gql是我们使用external gql访问的命名模块。在ReasonApolloType.gql中,有一个已定义的类型type gql = [@bs] (string => queryString);。这告诉bucklescript 将一种类型的字符串分配给gql类型并将值赋给querystring,因此type querystring的类型为string。然后设置ReasonApolloTypes.gql以使用“graphql-tag”节点库来解析ReasonApolloTypes.gql。

我在这里错过了一个概念吗?这表达正确吗?在这一点上,Bucklescript / Reason文档在我的头上是外部的。感谢。

1 个答案:

答案 0 :(得分:3)

这个问题在SO上真的不太合适(见what's on-topic here),也许应该在Discord上提出。但这就是它的含义:

  • external告诉编译器我们正在定义一些东西"外部",即。我们想要使用FFI。

  • [@bs.module]告诉BuckleScript我们引用的是一个模块,并且在使用它时需要发出require个电话。

  • gql是我们在原因方面用来引用它的名称。

  • :表示我们正在指定外部的类型。 ReasonApolloTypes.gqlReasonApolloTypes模块中定义的类型。

  • = "graphql-tag"告诉编译器我们引用的内容在JavaScript端名为graphql-tag

此外,type gql = [@bs] (string => queryString);指定它是从stringqueryString的函数,而[@bs]表示在调用此函数时它应该使用未经调用的调用约定。

因此,在ML方面,gql是一个函数,它接受string并返回queryString。被叫时:

let qs = [@bs] gql("some string"); /* [@bs] because it's uncurried */

BuckleScript将生成如下内容:

var qs = require("graphql-tag")("some string");
PS:总的来说,我建议你从简单的事情开始,尝试理解FFI系统。试图立即理解一切会导致学习曲线非常陡峭,并且会大大增加小误解的成本,因为它们往往会积累。