🔥

Тред (Дима Коваленко)


Где же найти ту самую СТРОГУЮ типизацию в мире js? Ну пока @rage_monk не закончит свой Hegel, то пока только в язык компилирующихся в JS. И сегодня хочу рассказать об одном, на мой взгляд, наиболее перспективном из такого рода языков – @reasonml
notion image

И как у любого ДРУГОГО языка отличного от js у него есть огромная проблема – вам крайне сложно будет найти людей которые будут уметь на нем писать. Именно поэтому я сегодня буду рассказывать только про плюшки ризона. Но это не отменяет что у него есть много своих проблем.

Ризон является диалектом функционального языка OCaml и компилируется через специальную тулзу (bucklescript) в javascript. Почему не использовать просто окамль? Потому что он выглядит еще более страшнее для js разработчиков ;)

Ризон как и окамл является языком семейства ML. А значит там есть тот самый вывод типов по Хиндли-Милнеру (вот больше инфы нормальным языком habr.com/ru/post/125250/) Но если коротко то типы выводятся по-красоте! То-есть на основании использования:
notion image

Тут ризон знает, что оператор + работает только с числами, а соответственно он может точно вывести типы аргументов. Но он тоже самое может сделать с внешними функциями:
notion image

Да, и тут в принципе нет аналога any. Поэтому reasonml имеет всегда 100% корректное покрытие типами вашего приложения. А если вы думаете что это слишком: Допустим ваше приложение имеет 100 типов. И корректность составляет 99.9%, то общая корректность кода -> 99.9% ^ 100 = 90.4

Похоливарилили сегодня за вывод типов из рантайма, aka IO. Запросы на сервер, чтение из файла, ну там то что мы не можем предсказать – вот на этом моменте ризон заставляет вас доказать что вы получили именно то, что и ожидали. Вот пример, я конечно понимаю что выглядит мерзко
notion image

Да, вот такую байду вам нужно написать чтобы спарсить ответ пришедший с сервера. И да я понимаю насколько это ужасно в реальной жизни. И да – это можно описать более компактно и системно с помощью контракта. Но факт в том что вы на 100% уверены что парсинг вернет вам именно то.

Следующее. Ризон функциональный язык, то есть у него есть готовая поддержка на уровне языка для композиции функций. Из коробки есть каррирование, pipeline оператор, pipe-first оператор и выглядит это вот так.
notion image

@jsunderhood А как он работает с коллекциями? Например в подобном кейсе какое будет его поведение: const a = [] // какой тип? a.push(1) // новый тип (какой?) или ошибка a.push("2") // и тд
twitter.com/i_kabirov/stat… Про коллекции. Ризон предостовляет возможность использовать js-овские массивы, но не приветствуется. Стандартная библотека тебе дает list (который является по-сути связным списком) который иммутабельный из коробки. (но медленее чем массив из js)
notion image

Еще одна фишка которая мне нравится именно в отдельных языках – это ограничения. JS сам по себе ужасно динамический язык который в принципе очень сложно статически анализировать. Например динамическое количество аргументов у функций - wtf. В ризоне такого нет

Это конечно иногда бывает крайне удобно, но зачастую приводит к таким странностям и в принципе отсутствием возможности покрыть типами конкретное API
notion image

Ну и основная плюха ризона это их варианты и паттерн-матчинг. Собственно это имплементация алгебраических типов данных – и очень удобная я вам скажу. Тут можно увидеть тонкую отсылку к flux и вообще тем как работает реакт под капотом.
notion image

И это действительно так, потому что первая версия реакта была написана на языке StandardML, и потом уже переписана на js и flow. А ризон делали собственно те люди, которые когда-то давно проектировали АПИ реакта. Именно это апи и стало прообразом редьюсеров:
notion image

И эта штука кстати отлично работает с константами, списками и массивами
notion image

Объекты типизируются с помощью самых обычных деклараций типов, единственное что явно указывать типы не обязательно, ризон сам попытается найти подходящий тип и выведет аргумент. Но я предпочитаю именно объекты (в ризоне - рекорды) явно декларировать.
notion image

Хмм ну не буду я же вам всю документацию тут пересказывать. Короче ReasonML – имеет очень мощный вывод типов на основании использования. Офигенную поддержку функциональшины (даже монадический синтаксис как в хаскле есть), иммутабельность и полную поддержку React.

Ох и самое важное забыл! Это же полноценный язык, поэтому он может билдится в нативный код как и окамл. В том числе и запускаться через wasm. Вот проект на который я ставлю ставку – кросс платформенные приложения на ризоне (без электрона github.com/revery-ui/reve…)