Clojure에서 일부 기능이 있는지 확인할 수 있습니까?함수가 부분 함수인지 어떻게 확인할 수 있습니까?
(partial? (partial + 10))
과 같은 것이 가장 좋을까요? 사전
Clojure에서 일부 기능이 있는지 확인할 수 있습니까?함수가 부분 함수인지 어떻게 확인할 수 있습니까?
(partial? (partial + 10))
과 같은 것이 가장 좋을까요? 사전
없음에
감사 부분에 의해 생성 기능은 그냥 "정상적인"기능 때문이다. 당신은 그러나이 같은 그것을 위해 일부 메타 데이터를 사용할 수 있습니다
정말하지만이 방법의 결과를 생각하지 않은
(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])))
을 문자열/분할은 분할 기능이있는과 (1.3) 또는 clojure.contrib.str-utils2 (1.2) clojure.string에서.
partial에서 생성 된 함수는 정상적인 함수이지만,이 함수를 사용하면 어쩌면 도움이 될만한 함수일까요? :
(defn partial?
[f]
(clojure.contrib.string/substring? "partial" (str (class f))))
면책 조항 : 이와 같은 내용이 속임수인지는 확실하지 않습니다.
해킹 할 수 있습니다.
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
의 내부가 해키 한 성질을 확인해야한다는 것을 알아야한다.
궁금한 점 : 왜 그렇게해야합니까? – viebel
@Yehonathan Clojure에서 Shen을 구현 중이며 정상적인 기능과 부분적인 기능이 다를 필요가 있습니다. (설계 결정으로 인해). –
셴이 무엇입니까? 또한'#()'을 통해 생성 된 익명 함수는 무엇입니까? – viebel