2015-07-31 27 views
11

, biz Data.Function.on var:Clojure'da Haskell'in bir işlevi var mı? Haskell'de

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c 
(.*.) `on` f = \x y -> f x .*. f y 

Clojure, ben tanımlamak mümkün istiyorum, örneğin, bir anagram yüklem şöyle:

(defn anagram? [word other-word] 
    (and (not= word other-word) 
     ((on = sort) word other-word))) 

Bu uygulamaya Önemsiz:

(defn on [g f] (fn [x y] (g (f x) (f y)))) 

Ancak, işlevini gerçekleştiren tüm işlevler var. ame hedefi? Bir tane bulamıyorum.

+4

belki '([gf] # üzerine yaz (g (map f% &) öğesini uygula))' clojure öğesinin varargs-if-mümkünse ruhu – noisesmith

cevap

4

Hayır, aradığınız şeyi yapan yerleşik yok.

(defn on 
    ([f g] 
    (fn [x y] 
     (f (g x) 
      (g y)))) 
    ([f g & args] 
    (on f #(apply g % args)))) 

Bu

(defn same-parity? [x y] 
    ((on = mod 2) x y)) 
gibi bir şey yazmanıza olanak tanır: Eğer olsa bunu hayata geçireceğiz, ben Clojure vararg desteği vardır ve currying yoksun beri, biraz daha genel olmak gelemez düşünüyorum Buile aynı işlevleri sağlamak için alışılmış yani mod kısmi uygulama biraz daha zahmetlidir, bir

sameParity :: (Integral a) => a -> a -> Bool 
sameParity = (==) `on` (`mod` 2) 

Ancak Clojure tabii çok Haskell kolaydır

, Yapabilirsenizargs.

+0

'on' varargs sürümü bana yanlış yoldan ... '((mod 2) xy) 'nin' (= (mod x 2) (mod y 2)) 'ye eşdeğer olduğunu doğru olarak okuyarak' '? Haskell versiyonunu çok beğendim, çünkü ('mod'2) argümanların sırasına göre açık, fakat Clojure’de (mod 2 x)' 'değil' (mod x 2)' bekleyebilirdim. – yurrriq

+1

@EricBailey Eski bir sürümü '(fn [x y]) ile özledim, eksik. Varargs siparişine gelince, benimki kesinlikle diğer kısmi-uygulamalı fonksiyonlara uyan emirdir. Karşılaştırma, örneğin, (swap! X/10) ':' '(swap! X # (/% 10))', '' değil (swap! X # (/ 10%)) '. Eğer haskell için alışkınsanız, doğal görünmeyebilir, ancak bu sıra alternatiften çok daha faydalıdır. – amalloy

+0

İkinci düşünce, '(mod x 2)' Clojure daha mantıklı, ben sadece varargs sürümü için herhangi bir arzu yok. – yurrriq

İlgili konular