Nano Hash - криптовалюты, майнинг, программирование

ошибка при определении функции с if

У нас есть простое определение функции:

(defn calculate [d x y]
  ((if (and (== d 1) (== x 1) (== y 0))
     1
     0)))
(println (calculate 1 1 0))

Но это приводит к этой ошибке:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke    (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at jline.ConsoleRunner.main(ConsoleRunner.java:69)
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
    at user$calculate.invoke(main.clj:13)
    at user$eval5.invoke(main.clj:17)
    at clojure.lang.Compiler.eval(Compiler.java:6465)
    at clojure.lang.Compiler.load(Compiler.java:6902)
    at clojure.lang.Compiler.loadFile(Compiler.java:6863)
    at clojure.main$load_script.invoke(main.clj:282)
    at clojure.main$script_opt.invoke(main.clj:342)
    at clojure.main$main.doInvoke(main.clj:426)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:401)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:518)
    at clojure.main.main(main.java:37)
    ... 5 more

(Кстати, строка 13 — это строка с if и and).

То же самое с векторами:

(defn calculate [vectorr]
  ((if (and (== (vectorr 0) 1) (== (vectorr 1) 1) (== (vectorr 2) 0))
     1
     0)))
(println (calculate [1 1 0]))

Это приводит к:

Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn

... одинаковый.

И с картой:

(defn calculate [mapp]
  ((if (and (== (mapp :d) 1) (== (mapp :x) 1) (== (mapp :y) 0))
     1
     0)))
(println (calculate {:d 1 :x 1 :y 0}))

Результат в том же сообщении:

Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn

Мы думаем, что это как-то связано с if или сравнениями. Мы попробовали это с обычными аргументами, вектором в качестве аргумента и с картой как таковой, и, очевидно, ошибка осталась прежней.

Мы также испробовали множество других вариантов без более глубокого понимания фактической проблемы.


  • Вообще говоря, если вы видите несколько левых скобок рядом друг с другом, вы, вероятно, делаете что-то не так. 09.10.2011
  • @Alex - очень хороший совет! в тех случаях, когда вы действительно хотите этого (т.е. применить возвращенную функцию более высокого порядка), тогда все же полезно сделать двойной дубль.... 09.10.2011
  • Обратите внимание, что if и and не являются функциями. 07.03.2012

Ответы:


1

У вас есть дополнительная пара круглых скобок вокруг тела вашей функции, что означает, что вы хотите вызвать результат if (который равен либо 1, либо 0 — т. е. длинному).

Так должно быть:

(defn calculate [vectorr]
  (if (and (== (vectorr 0) 1) (== (vectorr 1) 1) (== (vectorr 2) 0))
     1
     0))
08.10.2011
  • Ну да, я понимаю. Глупые скобки, обожаю их! -- Это снимает проблему. Спасибо за ваш быстрый ответ! 09.10.2011

  • 2

    Дополнительные скобки вызывают сбой вашей программы, потому что они изменяют возвращаемый тип вашего выражения. Заключив что-то в круглые скобки, в clojure вы завершите выражение как функцию. Затем ваша программа, которая ссылается на вывод этой функции, теперь фактически ссылается на саму функцию.

    Я обнаружил, что в 90% случаев, если я получаю исключение приведения класса в clojure, это потому, что я случайно создал cloSure.

    08.10.2011
  • Заключив что-то в круглые скобки, в clojure вы завершите выражение как функцию. Это не совсем так. Заключая что-то в круглые скобки, вы вызываете это как функцию — вы ни во что не оборачиваете и уж точно не создаете замыкание. 09.10.2011
  • И тебе спасибо! Также может быть, что мы проводим слишком много времени перед нашими экранами и становимся глупыми... 09.10.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..