在Clojure中,是否有类似Haskell的功能?

时间:2015-07-31 02:16:37

标签: haskell clojure functional-programming combinators

在Haskell中,我们有Data.Function.on

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

在Clojure中,我希望能够定义,例如, anagram谓词如下:

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

实施起来很简单:

faulthandler

但是有没有内置功能 那实现了同样的目标? 我似乎无法找到一个。

1 个答案:

答案 0 :(得分:4)

不,没有内置功能可以满足您的需求。但是,如果你要实现它,我认为你可以承担更多的通用性,因为Clojure有vararg支持并且缺乏currying:

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

这可以让你写出像

这样的东西
(defn same-parity? [x y]
  ((on = mod 2) x y))

当然在Haskell中也很容易,因为

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

但是在Clojure中,mod的部分应用有点棘手,所以如果可以的话,通过& args提供相同的功能是习惯的。