2015-07-31 16 views
11

Trong Haskell, chúng tôi có Data.Function.on:Trong Clojure, có chức năng nào giống Haskell không?

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

Trong Clojure, tôi muốn để có thể xác định, ví dụ, một vị ngữ đảo chữ như sau:

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

Đó là tầm thường để thực hiện:

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

Nhưng có chức năng tích hợp nào trong số hoàn thành ame mục tiêu? Tôi dường như không thể tìm thấy.

+4

có thể '(defn on [gf] # (áp dụng g (bản đồ f% &)))' trong tinh thể varargs-if-possible – noisesmith

Trả lời

4

Không, không có tích hợp sẵn những gì bạn đang tìm kiếm. Nếu bạn đang đi để thực hiện nó, tuy nhiên, tôi nghĩ bạn có thể đủ khả năng để được chung chung hơn một chút, vì Clojure đã hỗ trợ vararg và thiếu tách lạng bộ:

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

này cho phép bạn viết một cái gì đó giống như

(defn same-parity? [x y] 
    ((on = mod 2) x y)) 

trong đó tất nhiên là dễ dàng trong Haskell quá, như

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

Nhưng trong Clojure việc áp dụng một phần của mod là một phức tạp hơn chút, vì vậy nó là phong tục để cung cấp chức năng tương đương qua & args nếu bạn có thể.

+0

Phiên bản varargs của 'on' xoa tôi sai cách ... Tôi đọc chính xác rằng '((on = mod 2) xy)' tương đương với '(= (mod x 2) (mod y 2))'? Tôi thích phiên bản Haskell tốt, vì ('mod' 2) là rõ ràng về thứ tự của các đối số, nhưng trong Clojure tôi đã có thể mong đợi' (mod 2 x) 'không' (mod x 2) '. – yurrriq

+1

@EricBailey Đã dán một phiên bản cũ có chữ '(fn [x y])' bị thiếu, xin lỗi. Đối với thứ tự varargs, tôi chắc chắn là thứ tự phù hợp với các hàm áp dụng một phần khác. So sánh, ví dụ '(swap! X/10)': được chuyển thành '(swap! X # (/% 10))', không phải '(swap! X # (/ 10%))'. Nó có thể trông không tự nhiên nếu bạn được sử dụng để haskell, nhưng thứ tự này là hữu ích nhiều hơn thường xuyên hơn thay thế. – amalloy

+0

Trên suy nghĩ thứ hai, '(mod x 2)' có ý nghĩa hơn trong Clojure, tôi chỉ không có bất kỳ mong muốn cho phiên bản varargs. – yurrriq

Các vấn đề liên quan