Путать с вводом / проверкой типа и монадами - PullRequest
1 голос
/ 09 февраля 2020

Я только что познакомился с лучшим функциональным программированием и с тем, что у нас в 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. Это все ради понимания концепций.

Спасибо вам всем.

...