Могу ли я сопоставить шаблон с объектами JS?

Учитывая функцию, которая обращается к свойству объекта JavaScript:

let useFoo x => Js.log x##foo;

useFoo {"foo": 10};

- есть ли способ переписать его в соответствии с шаблоном для свойства?

Я надеялся, что что-то вроде этого сработает, но синтаксис неверен:

let useFoo {"foo"} => Js.log foo;

person ændrük    schedule 06.09.2017    source источник


Ответы (1)


Это невозможно сделать, и причина этого в том, что объекты Javascript - которые представляют собой не более чем сопоставление ключей со значениями - обрабатываются с помощью объектно-ориентированной системы Reason (то есть OCaml). В Reason / OCaml вы не можете сопоставить шаблон по функциям, т.е. если у меня есть запись, содержащая лямбда, я не могу сопоставить с образцом результат применения этой лямбды:

type t = {foo: int => int};

let bar {foo} => foo 5;

Обратите внимание, что я могу сопоставить с образцом и получить лямбду foo из записи, но я не могу применить foo внутри сопоставления с образцом - я должен применить его к аргументу «5» после того, как я его извлек.

Вот проблема с объектами: единственный интерфейс к объектам в Reason - через их общедоступные методы. Методы похожи на лямбды, за исключением того, что их первым аргументом всегда является self, то есть сам объект. Таким образом, каждый раз, когда мы обращаемся к x##foo, мы действительно отправляем метод foo, вводим его x в качестве аргумента и получаем результат обратно. Точно так же, как мы не можем сопоставить шаблон в Reason над функциональным приложением, мы также не можем сопоставить образец с объектами, поскольку объекты - это просто наборы функций, которые применяются автоматически.

person Bluddy    schedule 06.09.2017
comment
Чтобы добавить к этому, объекты JS типизированы как приподнятые объекты OCaml, но синтаксис для создания объектов JS в Reason на самом деле сахар для чего-то совершенно другого. { "foo": 42 } обессахаривается в [%bs.obj { foo = 42 }], что является расширением синтаксиса, передающимся записью. Таким образом, даже если вы могли бы сопоставить объекты с образцом, синтаксис необходимо преобразовать как в объекты, так и в записи, в зависимости от того, где он используется. - person glennsl; 07.09.2017