Вопрос №4868 от пользователя Катерина Шевцова в уроке «Рациональные числа», курс «JS: Составные данные»

Катерина Шевцова

доброго вечера!

/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20
  return pair('car');
         ^

TypeError: pair is not a function
    at car (/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20:10)
    at Object.toString (rational.js:10:33)
    at Object.<anonymous> (test.js:14:12)

не совсем понимаю, что значит пара не является функцией . какая именно пара?!... вот код:

export const make = (x, y)=> cons(x, y);

export const numer =(d)=> car(d);

export const denom =(d)=> cdr(d);

export const toString =(d)=> `${car(d)} / ${cdr(d)}`;

export const isEqual =(x, y)=> {
  if(car(x)*cdr(y)===car(y)*cdr(x)){return true}
  else {return false}
};

export const add = (x, y)=> {
  return (car(x)*cdr(y)+car(y)*cdr(x))/(cdr(x)*cdr(y));
};

export const sub = (x, y)=> {
  return (car(x)*cdr(y)-car(y)*cdr(x))/(cdr(x)*cdr(y));
};

export const mul = (x, y)=> {
  return (car(x)*car(y))/(cdr(x)*cdr(y));
};

export const div = (x, y)=> {
  return (car(x)*cdr(y))/(cdr(x)*car(y));
};
9 0

Катерина Шевцова

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

0

Роман Лахтадыр

Во первых, вы не пользуетесь абстракциями. Вы это нигде не используете:

export const make = (x, y)=> cons(x, y);
export const numer = (d) => car(d);
export const denom = (d) => cdr(d);

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

0

Катерина Шевцова

сделано! все равно так же ругается(

export const make = (x, y)=> cons(x, y);

export const numer =(dr)=> car(dr);

export const denom =(dre)=> cdr(dre);

export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`};
//console.log(toString);

export const isEqual =(x, y)=> {
  if(numer(x)*denom(y)===numer(y)*denom(x)){return true}
  else {return false}
};

export const add = (x, y)=> {
  return make(numer(x)*denom(y)+numer(y)*denom(x)), (denom(x)*denom(y));
};

export const sub = (x, y)=> {
  return make(numer(x)*denom(y)-numer(y)*denom(x)), (denom(x)*denom(y));
};

export const mul = (x, y)=> {
  return make(numer(x)*numer(y)), (denom(x)*denom(y));
};

export const div = (x, y)=> {
  return make(numer(x)*denom(y)), (denom(x)*numer(y));
};
0

Роман Лахтадыр

Что именно теперь пишет?

0

Катерина Шевцова

make: Entering directory `/usr/src/app'
babel-node --presets=es2015 test.js
/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20
  return pair('car');
         ^

TypeError: pair is not a function
    at car (/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20:10)
    at numer (rational.js:6:28)
    // export const numer =(dr)=> car(dr);
    at Object.toString (rational.js:10:41)
    // export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`};
    at Object.<anonymous> (test.js:14:12)
    // rational.toString(rational.add(rat1, rat2)),
0

Роман Лахтадыр

Посмотрите на последнюю строчку из этого трейса:

at Object.<anonymous> (test.js:14:12)

строка 14 - посмотрите какая операция там тестируется. скоее всего эта операция возвращает не пару. возможно у вас там скобки лишние.

0

Катерина Шевцова

assert.equal(
  rational.toString(rational.add(rat1, rat2)),
  rational.toString(rational.make(25, 6))
);
0

Катерина Шевцова

да! спасибо!! скобки были лишние в add!

но почему в тесте была отсылка к toString? эта функция ведь не имеет отношения к ошибке..

    at numer (rational.js:6:28)
    // export const numer =(dr)=> car(dr);
    at Object.toString (rational.js:10:41)
    // export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`};
    at Object.<anonymous> (test.js:14:12)
    // rational.toString(rational.add(rat1, rat2)),
0

Роман Лахтадыр

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

ваша функция toString уверена в том, что ей в качестве аргумента будет передана пара, но add возвращала совсем не пару. поэтому при попытке выполнить car на не паре return pair('car');, возникала ошибка pair is not a function.

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
7 июля 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
7 июля 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
7 июля 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
7 июля 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
7 июля 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
7 июля 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
7 июля 5 месяцев