Тип Reasonml с несколькими аргументами, исключение ошибки Ошибка (nth)

У меня ошибка при компиляции следующего кода

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;

Неустранимая ошибка: исключение Ошибка ("nth")
ниндзя: сборка остановлена: подкоманда не удалась.

Когда я меняю Rectangle на кортеж (int, int), он работает

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;

Разве нельзя иметь несколько аргументов в конструкторе данных?

Благодарность

Проблема отправлена ​​в бакелскрипт https://github.com/BuckleScript/bucklescript/issues/1822 < / а>


person kkpoon    schedule 24.07.2017    source источник
comment
Это исключение похоже на ошибку компилятора.   -  person Andreas Rossberg    schedule 24.07.2017


Ответы (1)


Оба варианта являются совершенно допустимым кодом причины. У вас могут быть конструкторы с несколькими аргументами, и вы делаете это правильно. По-видимому, проблема в функции Js.log, которая является своего рода волшебной функцией, и с n-мерными конструкторами магия не работает.

Итак, я предлагаю (i) сообщить о проблеме в трекере ошибок bucklescript и (ii) не использовать волшебную функцию Js.log, а получить или написать свою собственную функцию принтера и использовать ее.

person ivg    schedule 24.07.2017
comment
Одна из многих проблем использования нового языка - обязательно отправить отчет об ошибке в Reason, чтобы разработчики знали об этом. А пока также может оказаться полезным ppx_deriving.show? Не уверен, что этот плагин выполнит именно то, что хочет OP, или даже обязательно работает с Reason, но стоит взглянуть - person Nick Zuber; 24.07.2017