2010-05-12 6 views
33

Clojure는 하스켈의 g . f과 같은 구조를 구현할 수 있습니까 (g ∘ f)? 현재 (fn [n] (not (zero? n)))과 같은 해결 방법을 사용 중입니다. 어느정도 좋지는 않습니다.Clojure의 함수 구성?

답변

51

clojure.corecomp이라는 기능이 있습니다. 예 :

((comp not zero?) 5) 
; => true 

는 또한, ->/->> 예를 들어, 사용을 고려 할 수 있습니다

(-> 5 zero? not) 
; => true 
+2

하스켈에서 "currying"을 할 때는 'partial'을 사용해야합니다. 그래서 map/reduce의 경우,''(감속기 my-things))'(감속기 (comp)) (부분 축소 값 +) (부분 감속 +))' –

+1

또한 대체 할 수 있습니다. '(complement zero?) 5)' – defhlt

4

또 다른 방법은 (reduce #(%2 %1) n [zero? not])하지만 난 이미 마이클에 의해 언급 (comp not zero?), 더 좋아한다.

12

익명 함수에 대한 Clojure의 reader-macro 단축키를 사용하면 더 적은 키 입력으로 버전을 다시 작성할 수 있습니다.

not 및 다른 기능을 구성의 구체적인 사례를 들어
user=> (#(not (zero? %)) 1) 
true 

, 당신은 complement를 사용할 수 있습니다.

user=> ((complement zero?) 1) 
true 

when와 함께 not을 사용하고 ifif-notwhen-not 핵심 기능이다 충분히 일반적이다.

user=> (if-not (zero? 1) :nonzero :zero) 
:nonzero 
+0

reader-macro 단축키는 코드가 간결하고 읽기 쉽기 때문에 매우 유용하게 보입니다. 나는 또한 "if-not"와 "when-not"에 대해 몰랐다. 고마워! – StackedCrooked

+0

* 코어 매크로. 'if-not'와'when-not'가 매크로이기 때문에 런타임 비용이 들지 않습니다. – Carcigenicate