2016-05-31 83 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