Я большой поклонник семейства языков ML, если быть точным, Reason ML и OCaml. Мой интерес к Ocaml начался, когда я начал проверять свой код Javascript с помощью Flow Js и узнал, что Flow был построен на Ocaml.

Я начал с GitBook по ссылке ниже, которая представляет собой хорошее введение в Ocaml с нуля.



Мои проблемы начались, когда я начал работать с ADT (абстрактными типами данных) и, в частности, с деревьями.

Дерево — это тип данных, который имеет либо лист, либо узел.

Первая проблема возникла, когда меня попросили указать размер дерева, учитывая, что оно имеет несколько узлов и листьев.

Я привык к императивному обходу элементов, скажем, в списке, но понятия не имел, как проходить через абстрактные типы данных.

Функциональные языки программирования заставляют вас думать по-другому по сравнению с объектно-ориентированными языками или процедурными языками, такими как C. Итак, после нескольких часов борьбы я не смог найти решение, и я решил найти реализацию такой функции, которая бы найти размер.

Я так смутился, что потратил 2 часа, пытаясь понять функцию длиной в 3 строки. Однако мне стало любопытно узнать больше об абстрактных типах данных и деревьях.

Я начал решать 99 задач на Ocaml, и они оказались полезными, открывающими глаза вопросами. Ссылку на вопросы можно найти ниже. (Также есть хороший раздел про деревья)



Получив хорошее представление о том, как работают деревья, я понял, что DOM (модуль объекта документа) на самом деле является деревом, а элементы страницы — узлами. Текст между различными элементами можно рассматривать как листья.

Это точно такая же модель, на которой построены такие библиотеки, как React и Preact. Создайте объектное представление вашего DOM и рекурсивно вызовите метод рендеринга, который отобразит объект в DOM. Конечно, под капотом этих библиотек происходит гораздо больше вещей, таких как монтирование, размонтирование и т. д. Однако это фундаментальная основа, на которой они построили свои библиотеки.

Я так увлекся этой идеей, что при первом же вызове решил реализовать свой собственный рендерер Virtual Dom, который будет рендерить объекты в DOM.

Функция createElement принимает узел, и если он имеет тип string (A Leaf), то создается текстовый узел, в противном случае создается элемент, и функция createElement вызывается рекурсивно для дочерних элементов узла.

Ниже приведен объект, представляющий макет моего пользовательского интерфейса.

Это только начало. Я еще не гуру в функциональном программировании, но я добьюсь этого. Один шаг за раз.

Вот ссылка на проект, который я построил с помощью своих новых знаний :)