Я только что познакомился с лучшим функциональным программированием и с тем, что у нас в javascript вещей, которые я не знал, что это на самом деле было функционально.
Так что я думаю, что понял идею монады и функторов. То, что я не получаю, это, в частности, в javascript, как проверка типа / входов с помощью библиотек, таких как m onet или validate, делает любой код чище, чем просто возвращает Either со значением, являющимся значением ошибки?
Мне нравится этот доклад , потому что он объясняет таким образом, что я могу хотя бы лучше понять идею, лежащую в основе фп и композиции, но реализации, которые я вижу в javascript, не помогают с читабельностью .
Просто для примера, скажем, у меня есть следующий код:
function Just(aValue) {
this.v = function () {
return aValue;
}
}
function Invalid(anError) {
Just.call(this, anError); //call the parent because this function does nothing but change the instance type.
this.prototype = Object.create(Just.prototype); //we set the prototype to the function we want to inherit.
this.constructor = Invalid; // we set back the constructor to the this function so it gets its instance type.
}
function Title (aTitle) {
//cant be blank
if (aTitle == '') {
return new Invalid ('Title can\'t be blank');
}
//cant be bigger than
if (aTitle.length > 45) {
return new Invalid ('Title can\'t be bigger then 45 chars');
}
return new Just(aTitle);
}
function Description (aDescription) {
if (aDescription) {
//cant have more than 3 lines and
if (aDescription.split(/\r\n|\r|\n/).length > 3) {
return new Invalid ('not more than 3 lines');
}
//line cant be bigger than 65 chars
for (var index = 0; index < aDescription.split(/\r\n|\r|\n/).length; index++) {
if (aDescription[index].length > 65) {
return new Invalid ('lines cant be bigger than 65 chars');
}
}
}
function Item(aTitle, aDescription) {
this.Title = new Title(aTitle),
this.Description = new Description(aDescription)
}
var validItem = new Item('ValidTitle', 'ValidDesc');
//returns {Title:Just<ValidTitle>,Description:Just<ValidDesc>}
var InvalidItem = new Item('','');
//returns {Title:Invalid<'Title cant be empty'>,Just<''>}
Это вернет объект Item с ошибками или нет, который, я считаю, можно легко получить, проверив возвращены литеральные типы объектов. Допустим, это становится намного больше, или по каким-то причинам становится сложнее, чем это. Как проверка «монады» может помочь мне? Любые примеры в javascript, подобные разговорам, были бы великолепны.
Код примера - это просто я пытаюсь воплотить идею на практике. Нет идеи, что это правильная реализация или нет. FIY это так, как нарочно, я знаю, у es6 есть соответствующие классы и т. Д. c. Это все ради понимания концепций.
Спасибо вам всем.