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+ [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)”]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+ [
我希望重写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)”]