首先,我不是在寻找这个问题的答案,我简单地寻求澄清。这是一个4clojure问题,措辞有点暧昧,似乎没有涵盖任何例子。问题是:http://www.4clojure.com/problem/166
文本:
对于任何可订购数据类型,可以从单个操作(任何运算符但是=或≠将起作用)导出所有基本比较运算(<,≤,=,≠,≥和>)。编写一个带三个参数的函数,一个小于数据的运算符和两个要比较的项。该函数应返回描述两个项之间关系的关键字。 x和y之间关系的关键字如下: x = y→:eq x> y→:gt x< y→:lt
答案 0 :(得分:5)
问题是要求你定义一个像
这样的函数(defn compare [lt x y] ...)
其中lt
是两个参数的函数,它返回第一个参数是否小于第一个参数。
(defn compare [lt x y]
(if (lt x y)
...))
答案 1 :(得分:2)
事实上,在clojure核心中有一个特殊功能:comparator
。它从任何带有两个args的函数生成比较器并返回truthy或falsey val。该比较器本身就是一个函数,当arg1和arg2的函数为真时返回-1
,当arg2和arg1的函数为真时返回1
,否则返回0
:
user> ((comparator <) 1 2)
-1
user> ((comparator <) 2 1)
1
user> ((comparator <) 1 1)
0
user> ((comparator (fn [a b] (< (count a) (count b)))) [1 2 3] [4])
1
user> ((comparator (fn [a b] (< (count a) (count b)))) [] [4])
-1
user> ((comparator (fn [a b] (< (count a) (count b)))) [10] [4])
0
所以,从4clojure应用到任务就足以创建比较器,比较val并得到-1,0或1所需的指标。