Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 简化这个单子表达式_Clojure - Fatal编程技术网

Clojure 简化这个单子表达式

Clojure 简化这个单子表达式,clojure,Clojure,在看了本教程之后,我正在学习我自己的一些例子:和阅读 我提出了以下功能: (defn unit [v s] (fn [] [v s])) (defn bind [mv f] (f (mv))) (defn inc+ [mv] (bind mv (fn [[v s]] (let [r (inc v)] (unit r (apply str (concat s " inc+(" (str r) ")"))))))) (defn double+ [

在看了本教程之后,我正在学习我自己的一些例子:和阅读

我提出了以下功能:

(defn unit [v s] (fn [] [v s])) (defn bind [mv f] (f (mv))) (defn inc+ [mv] (bind mv (fn [[v s]] (let [r (inc v)] (unit r (apply str (concat s " inc+(" (str r) ")"))))))) (defn double+ [mv] (bind mv (fn [[v s]] (let [r (* 2 v)] (unit r (apply str (concat s " double+(" (str r) ")"))))))) (defn triple+ [mv] (bind mv (fn [[v s]] (let [r (* 3 v)] (unit r (apply str (concat s " triple+(" (str r) ")"))))))) ;; Testing: ((-> (unit 1 "1 ->") inc+)) ;; => [2 "1 -> inc+(2)"] ((-> (unit 3 "3 ->") inc+ double+ inc+)) ;; => [27 "3 -> inc+(4) double+(8) inc+(9) triple+(27)"] (定义单位[VS] (fn[][v s])) (定义绑定[mv f] (f(mv))) (德芬公司+[mv] (绑定 mv (fn[[v s]] (让[r(inc v)] (单位r(应用str(concat s“inc+(“(str r)”)))))))))))))))))))))))))))))(如有需要,请按 (defn双精度+[mv] (绑定 mv (fn[[v s]] (让[r(*2 v)] (单位r(适用str(concat s“double+(“(str r)”))))))))))))))))))))))))))))(如适用于 (defn三重+[mv] (绑定 mv (fn[[v s]] (让[r(*3 v)] (单位r(应用str(concat s“triple+(“(str r)”))))))))))))))))))))))))))))))(如有必要 ;; 测试: (((->(第1单元“1->”)公司+) ;; => [2“1->inc+(2)”] (((->(第3单元“3->”)inc+double+inc+) ;; => [27“3->inc+(4)双+(8)inc+(9)三+(27)”]
我希望重写bind来封装inc+double+和triple+方法的模式,并获得与以前相同的输出。如何做到这一点?

我分两个阶段得出结论:

(defn unit [v s] (fn [] [v s])) (defn bind [mv f] (let [[iv is] (mv) [av as] (f iv)] (unit av (str is " " as)))) (defn inc+ [mv] (bind mv (fn [v] [(inc v) (str " inc+(" (inc v) ")")]))) (defn double+ [mv] (bind mv (fn [v] [(inc v) (str " double+(" (inc v) ")")]))) (defn triple+ [mv] (bind mv (fn [v] [(inc v) (str " triple+(" (inc v) ")")])))
这是实现相同结果的另一种写入方法,请注意,更改是去掉
单元
中的lambda函数以及相关的
绑定
do-m
调用

(defn unit [v s] [v s]) (defn bind [mv f] (let [[v s] mv r (f v) xs (->> (str (type f)) (re-find #"\$([^\$]*)\$?") second) ] (unit r (str s " " (str xs "(" r ")"))))) (defn double [v] (* 2 v)) (defn triple [v] (* 3 v)) (defn sqrt [v] (Math/sqrt v)) (defn do-m [v & fs] (let [fn-ms (map #(fn [mv] (bind mv %)) fs)] ((apply comp (reverse fn-ms)) (unit v (str v " ->"))))) (do-m 3 inc double double triple triple sqrt) ;; => [12.0 "3 -> inc(4) double(8) double(16) triple(48) triple(144) sqrt(12.0)"] (定义单位[VS][VS]) (定义绑定[mv f] (让[v s]mv r(f v) xs(->>(str(f型)) (重新查找“\$([^\$]*)\$?”) (第二)] (单位r(str s)(str xs)(“r”))) (定义双[v](*2V)) (定义三重[v](*3V)) (定义sqrt[v](数学/sqrt v)) (定义do-m[v&fs] (让[fn-ms(map#)(fn[mv](bind-mv%))fs)] ((应用补偿(反向fn-ms))(单位v(str v“->”))) (do-m 3 inc双三重sqrt) ;; => [12.0“3->inc(4)双(8)双(16)三(48)三(144)平方米(12.0)”]
我分两个阶段找到了答案:

(defn unit [v s] (fn [] [v s])) (defn bind [mv f] (let [[iv is] (mv) [av as] (f iv)] (unit av (str is " " as)))) (defn inc+ [mv] (bind mv (fn [v] [(inc v) (str " inc+(" (inc v) ")")]))) (defn double+ [mv] (bind mv (fn [v] [(inc v) (str " double+(" (inc v) ")")]))) (defn triple+ [mv] (bind mv (fn [v] [(inc v) (str " triple+(" (inc v) ")")])))
这是实现相同结果的另一种写入方法,请注意,更改是去掉
单元
中的lambda函数以及相关的
绑定
do-m
调用

(defn unit [v s] [v s]) (defn bind [mv f] (let [[v s] mv r (f v) xs (->> (str (type f)) (re-find #"\$([^\$]*)\$?") second) ] (unit r (str s " " (str xs "(" r ")"))))) (defn double [v] (* 2 v)) (defn triple [v] (* 3 v)) (defn sqrt [v] (Math/sqrt v)) (defn do-m [v & fs] (let [fn-ms (map #(fn [mv] (bind mv %)) fs)] ((apply comp (reverse fn-ms)) (unit v (str v " ->"))))) (do-m 3 inc double double triple triple sqrt) ;; => [12.0 "3 -> inc(4) double(8) double(16) triple(48) triple(144) sqrt(12.0)"] (定义单位[VS][VS]) (定义绑定[mv f] (让[v s]mv r(f v) xs(->>(str(f型)) (重新查找“\$([^\$]*)\$?”) (第二)] (单位r(str s)(str xs)(“r”))) (定义双[v](*2V)) (定义三重[v](*3V)) (定义sqrt[v](数学/sqrt v)) (定义do-m[v&fs] (让[fn-ms(map#)(fn[mv](bind-mv%))fs)] ((应用补偿(反向fn-ms))(单位v(str v“->”))) (do-m 3 inc双三重sqrt) ;; => [12.0“3->inc(4)双(8)双(16)三(48)三(144)平方米(12.0)”]