2016-05-31 17 views
0

Ich komme aus einem Javascript-Hintergrund & Ich versuche zu verstehen, wie ich ein Programm mit Reason/Ocaml Modul-System strukturieren/erstellen muss.OCaml/Grund Design-Module

Als Übung lassen Sie uns sagen, dass ich dieses Stück Javascript schreiben wollen in OCaml/Grund (es wird auf js durch js_of_ocaml kompilieren zurück)

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

Wie soll ich mein Programm entwerfen, dies zu erreichen?

Sollte ich ein Modul machen, das ein anderes Modul nimmt, um einen GraphQLObjectType in js durch js_of_ocaml zu erzeugen?

Wie würde ich diesen Typ strukturieren, der einen GraphQLObjectType unterstützt?

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

I Felder bedeuten, ist ein Thunk, die eine Karte zurückgibt, die eine unbekannte Menge Felder enthält. (jedes graphqlobject hat verschiedene Felder) Um welchen Typ muss diese Karte in OCaml/Reason erstellt werden, muss ich meine eigenen erstellen?

+1

Es ist ein bisschen empfindlich ist, Ihnen zu antworten, weil Sie Konzept zu übertragen versuchen, die Idiomatik in Javascript zu OCaml und OCaml verwenden verschiedene Idiome. In diesem Fall sieht es so aus, als ob eine einzige Funktion mit beschrifteten und optionalen Argumenten den Zweck erfüllen würde. – Drup

+0

Kennen Sie irgendwelche Ressourcen, wo ich mehr über das Denken in OCaml lernen kann? d. h. Bücher? – Seneca

+1

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

Antwort

0

Nur für Sie den Geschmack von OCaml, die direkten (syntaktische) Übersetzung wäre zu fühlen:

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

Grundsätzlich ich js Objekte zu OCaml Aufzeichnungen abgebildet. Es gibt auch Objekte in OCaml mit Methoden und Vererbung, aber ich denke, dass Datensätze immer noch eine nähere Abstraktion sind. Die Datensätze können als benanntes Tupel angesehen werden und natürlich Funktionen enthalten. Module sind schwerere Abstraktionen, also auch eine Sammlung von Feldern. Im Gegensatz zu Records können Module Typen, andere Module und grundsätzlich jede andere syntaktische Konstruktion enthalten. Da Typen zur Kompilierzeit entfernt werden, ist die Laufzeitdarstellung eines Moduls absolut identisch mit der Darstellung von Datensätzen. Module definieren auch Namespaces. Da OCaml Aufzeichnungen durch die Namen ihrer Felder definiert sind, ist es immer sinnvoll, jeweils Aufzeichnungen in einem eigenen Modul zu definieren, zB

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

Vielen Dank! Ich denke, ich habe noch einen langen Weg vor mir, bevor ich anfange, in OCaml zu denken ... – Seneca