1

私は Javascript のバックグラウンドを持っており、Reason/Ocaml のモジュール システムを使用してプログラムを構築/構築する方法を理解しようとしています。

演習として、この javascript を OCaml/Reason で書きたいとします (js_of_ocaml を介して js にコンパイルし直します)。

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 */

fields は、不明な量のフィールドを含むマップを返すサンクです。(graphqlobject ごとに異なるフィールドがあります) OCaml/Reason では、このマップはどの型に対応していますか? 自分で作成する必要がありますか?

4

1 に答える 1

1

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
于 2016-06-01T12:48:15.497 に答える