2016-05-31 84 views
0

我来自Javascript背景&我想了解我需要如何用Reason/Ocaml的模块系统构建/构建程序。OCaml /原因设计模块

作为练习,让我们说,我想写这段JavaScript OCaml中/原因(编译会回到JS通过js_of_ocaml)

var TeaType = new GraphQLObjectType({ 
    name: 'Tea', 
    fields:() => ({ 
     name: {type: GraphQLString}, 
     steepingTime: {type: GraphQLInt}, 
    }), 
}); 

我应该如何设计我的程序做到这一点?

我应该创建一个模块,它需要另一个模块通过js_of_ocaml在js中生成GraphQLObjectType吗?

我该如何构造这种支持GraphQLObjectType的类型?

Tea.re 
let name = "Tea"; 
let fields = /* what type should I make for this? Tea is 
      just one of the many graphql-types I'll probably make */ 

我的意思是字段,它返回一个地图包含字段的未知量的形实转换。 (每个graphqlobject有不同的字段) 这是OCaml/Reason中的映射类型,我需要自己创建吗?

+1

这有点微妙的回答你,因为你正在传送的概念,是javascript中的习惯用法与OCaml以及OCaml使用不同的习语。在这种情况下,如果我理解正确,看起来像带有标签和可选参数的单个函数应该能够做到这一点。 – Drup

+0

你知道任何资源,我可以更多地了解OCaml思考吗?即书籍? – Seneca

+1

http://ocaml.org/learn/和https://realworldocaml.org/ – Drup

回答

0

只为你感到OCaml中的味道,直接(语法)的翻译是:

let tea_type = GraphQL.Object.{ 
     name = "Tea"; 
     fields = fun() -> QraphQL.Field.[{ 
      name = GraphQL.Type.{name : GraphQL.string } 
      steeping_time = GraphQL.Type.{name : QraphQL.int } 
     }] 
    } 

基本上,我映射JS对象OCaml中的记录。 OCaml中还有一些对象具有方法和继承,但我认为这些记录仍然是一个更接近抽象的概念。这些记录可以看作是一个命名的元组,当然也可以包含函数。模块,是更重的重量抽象,这也是一个领域的集合。与记录不同,模块可能包含类型,其他模块和基本上任何其他语法结构。由于类型在编译时被删除,所以模块的运行时表示与记录的表示完全相同。模块也定义了命名空间。由于OCaml的记录是由它们的字段的名称定义的,它始终是自己的模块,例如,在定义每个记录有用的,

module GraphQL = struct 
    let int = "int" 
    let string = "string" 

    module Type = struct 
    type t = { 
     name : string 
    } 
    end 

    module Field = struct 
    type t = { 
     name : string; 
     steeping_time : Type.t 
    } 
    end 

    module Object = struct 
    type t = { 
     name : string; 
     fields : unit -> Field.t list 
    end 
end 
+0

非常感谢!我想在OCaml开始思考之前我还有很长的路要走...... – Seneca