передача функций в качестве аргументов в clojure

у меня есть функция, которая принимает функцию и число и возвращает его применение функции на число, а функция Куба:

(defn something [fn x]
  (fn x))

(defn cube [x]
  (* x x x))

когда я вызываю функцию следующим образом это работает:

(something cube 4)

но это возвращает сообщение об ошибке:

(something Math/sin 3.14)
, работает:
(something #(Math/sin %) 3.14)

каково объяснение?

1 ответов


Math.sin - Это не функция! Это метод прямо из Java и не понимает различных правил, которым должны следовать функции Clojure. Если вы обернете его в функцию, то эта функция может действовать как прокси, передавая аргументы "тупому" методу и возвращая результаты в ваш "умный" функционально-ориентированный контекст.