Я новичок в Clojure и мне нужна помощь с моим кодом. Вот ситуация:
Моя первая таблица (продукты) выглядит так: (product_name price)
([1 (candies 6.5)]
[2 (sweets 1.75)]
[3 (jam 2.99)]
[4 (gum 1.25)])
Моя первая таблица (продукты) выглядит так: (customer_name product_name quantity)
([1 (Sara candies 3)]
[2 (Joe jam 3)]
[3 (Sara gum 1)])
Что я пытаюсь сделать, так это если я наберу, например, Сару, я получу сумму продаж, сделанных Сарой, что означает: (3 * 6,5 доллара + 1 * 1,25 доллара) = 20,75 доллара (в данном случае)
Я в порядке для входной части (я получаю имя клиента как ввод из терминала) Однако мой код:
(defn sales_prices_with_cond [name_cus] (map
(fn [y z]
(if (= (str name_cus) (str (nth (first z) 1)))
list (* (Double. (nth (second y) 1)) (Integer/parseInt (nth (second z) 2))))
)
products
sales))
(println (reduce + sales_prices_with_cond "Sara"))
Дает мне сумму ВСЕХ продаж*количества. Вроде условие пропущено или может не так написано... Я также пробовал с (некоторыми) и получил тот же результат...
Пожалуйста помоги :') .





Ваши таблицы не выглядят как допустимый код Clojure, что затрудняет вам помощь - это строки? Я бы преобразовал первую в карту вида:
(def prices {"candies" 6.5}) ;etc
Ваша вторая таблица будет выглядеть примерно так:
(def sales [["sarah" "candies" 3]]) ;etc
И тогда ваша основная функция:
(defn sales-by-customer [name-cus]
(->> sales
(filter #(= (first %) name-cus))
(map #(* (last %) (prices (second %)))
(reduce +)))
На самом деле, таблицы были даны мне таким образом (я не делал их сам, что тоже немного усложняет мне задачу). Да, все записи являются строками, но я проанализировал числа, с которыми хотел работать в процессе. Я попробую ваше предложение. Спасибо!
Следуя вашей логике, я преобразовал свои таблицы, как вы предложили, и вызвал функцию. Однако у меня есть эта ошибка: синтаксическая ошибка (ClassCastException) при компиляции в (db.clj: 76: 1). класс clojure.lang.LazySeq не может быть приведен к классу clojure.lang.IFn (clojure.lang.LazySeq и clojure.lang.IFn находятся в безымянном модуле загрузчика 'app'
Я не понимаю, почему у меня есть исключение приведения, когда мы должны вернуть число?
может быть, цены - это последовательность, а не карта, поэтому он пытается вызвать последовательность и терпит неудачу. цены должны быть в формате {ключ1 значение1 ключ2 значение2}
Я думаю, это должно быть
(reduce + (sales_prices_with_cond "Sara"))? Вашmapзастегивает две таблицы — в любом случае это сработает только случайно, когда клиент и продукт совпадут. Составьте карту с ценами на товары. Затем отфильтруйте продажи для соответствующего клиента. Наконец, уменьшите это, рассчитайте цену продукта, умножьте на количество.