2017-07-24 2 views
3

Ich habe Fehler bekam während den folgenden Code kompilierenReasonml Typ mit mehreren Argumenten, Fehler Ausnahme Failure ("n")

type shape = 
    | Circle int 
    | Square int 
    | Rectangle int int; 

let myShape = Circle 10; 

let area = 
    switch myShape { 
    | Circle r => float_of_int (r * r) *. 3.14 
    | Square w => float_of_int (w * w) 
    | Rectangle w h => float_of_int (w * h) 
    }; 

Js.log area; 

Fatal error: exception Failure("nth")
ninja: build stopped: subcommand failed.

Wenn ich die Rectangle ändern (int, int) Tuple, es Werke

type shape = 
    | Circle int 
    | Square int 
    | Rectangle (int, int); 

let myShape = Circle 10; 

let area = 
    switch myShape { 
    | Circle r => float_of_int (r * r) *. 3.14 
    | Square w => float_of_int (w * w) 
    | Rectangle (w, h) => float_of_int (w * h) 
    }; 

Js.log area; 

Ist es nicht möglich, mehrere Argumente auf einem Daten Konstruktor zu haben?

dank

Ausgabe vorgelegt worden https://github.com/BuckleScript/bucklescript/issues/1822

+2

Diese Ausnahme sieht wie ein Compilerfehler aus. –

Antwort

3

Beide Varianten sind absolut gültige Ursachencode buckelscript. Sie können Konstruktoren mit mehreren Argumenten haben, und Sie tun es richtig. Anscheinend ist das Problem in der Js.log Funktion, das ist eine Art magische Funktion und mit den n-ary Konstruktoren, scheitert die Magie.

Also, mein Vorschlag ist (i) ein Problem in der Bucklescript-Bug-Tracker und (ii) nicht die magische Js.log Funktion, sondern ableiten oder schreiben Sie Ihre eigene Druckerfunktion und verwenden Sie es.

+1

Einer der vielen Probleme bei der Verwendung einer neueren Sprache - definitiv einen Fehlerbericht an Reason senden, damit die Entwickler davon wissen. Auch in der Zwischenzeit könnte [ppx_deriving.show] (https://github.com/whitequark/ppx_deriving) nützlich sein? Nicht sicher, ob dieses Plugin genau das erreichen würde, was OP will oder sogar unbedingt _work_ mit Reason, aber einen Blick wert ist –