Как я могу проверить, является ли функция частичной? - PullRequest
5 голосов
/ 27 февраля 2012

Есть ли возможность проверить, является ли что-то частичным в Clojure?

Было бы лучше иметь что-то вроде (partial? (partial + 10))?

Заранее спасибо

Ответы [ 3 ]

16 голосов
/ 27 февраля 2012

Нет, потому что функции, созданные частично, являются просто "нормальными" функциями.Однако вы могли бы использовать для этого некоторые метаданные, например:

(defn partial2 [f & more]
  (with-meta (apply partial f more) {:partial true}))

(def partial-plus (partial2 + 1 2))

(meta partial-plus) ;;=> {:partial true}

Хотя на самом деле не задумывались о последствиях этого подхода ...

Kotarak предложил более приятное решение, котороеработает, но не всегда.Например, возьмем это:

(partial? (partial + 1)) ;;=> true
(partial? (partial + 1 2)) ;;=> false

Это работает:

(defn partial? [f]
  (let [[fst snd] (-> (class f) (.getName) (string/split #"\$"))]
    (= ["clojure.core" "partial"] [fst snd])))

со строкой / split, являющейся функцией split из clojure.string (1.3) или clojure.contrib.str-utils2 (1.2).

5 голосов
/ 27 февраля 2012

Вы можете взломать.

user=> (let [partial-classes (map class [(partial + 1)
                                         (partial + 1 2)
                                         (partial + 1 2 3)
                                         (partial + 1 2 3 4)])]
         (defn partial?
           [x]
           (some #(instance? % x) partial-classes)))
#'user/partial?
user=> (partial? (partial - 1))
true
user=> (partial? (partial - 1 2))
true
user=> (partial? (partial - 1 2 3))
true
user=> (partial? (apply partial - 1 2 [3 4 5]))
true

РЕДАКТИРОВАТЬ: Исправлено в соответствии с комментарием Михила.То, что вы должны знать внутренности partial, подтверждает хакерскую природу.

2 голосов
/ 27 февраля 2012

Функции, созданные частично, являются обычными функциями, но если вы одержимы этим, может быть, что-то подобное может помочь? :

(defn partial?
  [f]
  (clojure.contrib.string/substring? "partial" (str (class f))))

Отказ от ответственности: я не знаю, является ли что-то подобное безошибочным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...